نکاتی برای بهبود کدنویسی برنامه‌های اندرویدی

در کدنویسی، انتخاب الگوریتم مناسب و داده‌های مناسب از اهمیت بسیار زیادی برخوردار است. در این نوشته نکاتی را برای تقویت مهارات کدنویسی بیان می‌کنیم.

برای نوشتن یک کد خوب دو قانون اصلی وجود دارد:

  • کاری که به آن نیاز ندارید را انجام ندهید
  • در صورت امکان از اختصاص‌دادن حافظه پرهیزکنید

یکی از مشکلاتی که برنامه‌های اندرویدی از آن رنج می‌برند این است که برنامه روی چندین سخت‌افزار اجرا می‌شود. نسخه‌های متفاوت با سرعت‌های متفاوتی اجرا می‌شوند. به‌صورت کلی، نمی‌توانید بگویید که دستگاه x سرعت بیشتری از دستگاه y دارد. تفاوت زیادی بین دستگاهی که JIT دارد با و دستگاهی که JIT ندارد، وجوددارد. کدی که برای دستگاه حاوی JIT مناسب است گاهی اوقات برای دستگاهی که JIT ندارد، مناسب نیست. برای اینکه مطمئن شوید برنامه‌ای که ساخته‌اید روی اکثر دستگاه‌ها جوابگو است، باید کد خود را از تمام جهات مورد سنجش قراردهید.

از موضوعات غیر ضروری پرهیز کنید

  • ایجاد موضوعات رایگان نیست. استفاده از حافظه همواره هزینه بیشتری در برابر عدم استفاده از حافظه دارد.
  • اگر روش شما باعث بازگشت یک رشته می‌شود، و مطمئن هستید که این روش باعث ضمیمه‌شدن یک رشته می‌شود، روش خود را تغییر دهید تا تابع شما مستقیما ضمیمه‌شود.
  • هنگامی‌که می‌خواهید از داده‌های ورودی یک رشته استخراج کنید، به جای کپی‌کردن سعی کنید یک زیررشته از داده اصلی را برگشت دهید.
  • آرایه int بسیار بهتر از آرایه integer است. دو آرایه موازی int بسیار موثرتر از آرایه (int,int) است.
  • هنگامی که می‌خواهید ظرفی را که حاوی چندتایی (Foo, Bar ) است اجراکنید، به یاد داشته باشید که استفاده از []Foo و []Bar بسیار موثرتر از آرایه (foo,bar) خواهدبود.

استفاده از استاتیک بجای ویرچوال(مجازی)

اگر نمی‌خواهید به فیلد موضوعات دسترسی داشته باشید از روش استاتیک استفاده کنید. این روش ۱۵ تا ۲۰ درصد سریعتر خواهدبود.

برای ثابت‌ها از استاتیک استفاده کنید

فرض کنید جمله زیر در بالای یک کلاس آورده‌شود:

static int intVal = 42;
static String strVal = “Hello, world!”;

این جمله باعث ایجاد روشی به نام clinit می‌شود. این روش عدد ۴۲ را درون intval ذخیره می‌کند. می‌توانید با استفاده از کلمه final جمله بالا را بهبود ببخشید.

static final int intVal = 42;
static final String strVal = “Hello, world!”;

استفاده از حلقه فور افزایشی

از این حلقه می‌توان برای اجرای آرایه‌ها استفاده برد

static class Foo {
int splat;
}

Foo[] array = …

public void zero() {
int sum = 0;
for (int i = 0; i < array.length; ++i) {
sum += array[i].splat;
}
}

public void one() {
int sum = 0;
Foo[] localArray = array;
int len = localArray.length;

for (int i = 0; i < len; ++i) {
sum += localArray[i].splat;
}
}

public void two() {
int sum = 0;
for (Foo a : array) {
sum += a.splat;
}
}

()zero کندترین است زیرا JIT نمی‌تواند طول آرایه برای هرتکرار در حلقه را بهینه‌سازی کند.

()One سریعتر است، همه چیز را وارد متغیرهای موضعی می‌کند.

()Two برای دستگاهی که JIT ندارد، سریعترین حالت ممکن است.

به جای دسترسی خصوصی با کلاس‌های داخلی خصوصی یک پکیج را درنظر بگیرید

کلاس تعریف شده در زیر را درنظر بگیرید:

public class Foo {
private class Inner {
void stuff() {
Foo.this.doStuff(Foo.this.mValue);
}
}

private int mValue;

public void run() {
Inner in = new Inner();
mValue = 27;
in.stuff();
}

private void doStuff(int value) {
System.out.println(“Value is ” + value);
}
}

در اینجا ما یک کلاس درونی خصوصی را تعریف کرده‌ایم که به یک روش درونی خصوصی و یک فیلد خصوصی در کلاس بیرونی دسترسی دارد. این کد عدد ۲۷ را چاپ خواهدکرد.

مشکلی که وجود دارد این است که VM این کد را غیرقانونی تلقی می‌کند. برای حل این مشکل از کد زیر استفاده کنید

/*package*/ static int Foo.access$100(Foo foo) {
return foo.mValue;
}
/*package*/ static void Foo.access$200(Foo foo, int value) {
foo.doStuff(value);
}

از Floating-point استفاده نکنید

اجرای floating-points روی دستگاه‌های اندرویدی دو برابر کندتر است. در سخت‌افزارهای مدرن از نظر سرعت بین float و double تفاوتی وجود ندارد. از نظر فضا، double دوبرابر بزرگتر است. اگر فضای موجود، مسئله محدودکننده نباشد، باید از double استفاده کنید.

کتابخانه‌ها را بشناسید و از آنها استفاده کنید

همیشه به یاد داشته باشید که کدهای موجود در کتابخانه‌ها می‌توانند بهتر از بهترین کدهای JIT برای جاوا باشند. برای مثال روش System.arraycopy می‌تواند ۹ برابر سریعتر از کد نوشته‌شده توسط JIT روی نکسوس باشد.

از روش‌های خصوصی با دقت زیادی استفاده کنید

استفاده از کدهای Android NDK لزوما موثرتر از کدهای تهیه‌شده توسط جاوا نیستند. گاهی اوقات JIT قادر به بهینه‌سازی محتویات خصوصی نیست. برای مثال کد مخصوص استفاده‌شده برای پردازنده ARM در G1 روی نکسوس به خوبی اجرا نمی‌شود و کد مخصوص ARM در نکسوس روی G1 اجرا نمی‌شود.

از این کدها فقط زمانی باید استفاده کنید که یک کدبیس داشته باشید و بخواهید آن را به اندروید پورت کنید و هدفتان نباید افزایش سرعت برنامه اندرویدی خود باشد که با زبان جاوا نوشته شده‌است.

همیشه اندازه‌گیری کنید

قبل از آغاز بهینه‌سازی ابتدا مطمئن شوید مشکلی وجود دارد که باید آن را حل کنید. مطمئن شوید که می‌توانید نحوه عملکرد فعلی خود را مورد ارزیابی قراردهید.

Traceview می‌تواند به شما کمک کند، اما به یاد داشته باشید که این کار باعث غیرفعال شدن JIT می‌شود. بسیار مهم است که مطمئن شوید سرعت اجرای کد پس از اعمال تغییرات پیشنهادشده توسط Traceview بیشتر از حالت عدم استفاده از Traceview باشد.

دیدگاه‌ خود را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.