مقایسه سرعت اجرای دستورات شرطی در Android

  • فکر میکنید سرعت اجرای دستورات شرطی در android چه تفاوتی با یکدیگر دارد؟!
  • کدام دستور بیشترین و کدامیک کمترین زمان را مصرف خواهند کرد؟!

در این پست میخواهیم مقایسه ای بین سرعت اجرای سه دستور شرطی If، Switch و عملگر سه گانه (Ternary) داشته باشیم. البته با توجه به استفاده از جاوا در اندروید، شاید بهتر بود که عنوان این پست را مقایسه دستورات شرطی در جاوا، نامگذاری کنیم، اما از آنجا که کل عملیات برای اجرا در موبایل و در محیط Android Studio اتفاق افتاده است، نام فعلی را انتخاب نمودم.

Android

برای انجام این کار، از کلاس AsyncTask به منظور اجرای یک Thread جداگانه استفاده کرده و در یک حلقه بزرگ به دفعات دستورات مذکور را اجرا میکنیم.

با اندازه گیری زمان مورد استفاده و در نهایت محاسبه میانگین زمان، به مقدار نسبتا دقیقی از تفاوت زمان اجرای هر دستور دست پیدا خواهیم کرد.

قالب کلی این مقایسه به صورت زیر است. انتصاب متغیر dummy، نماینده یک دستور مرجع برای این آزمایش میباشد:

for (int i = 0; i <= count; i++) {
    if (dummy == 0) {
        dummy = 1;
    } else {
        dummy = 0;
    }
}


for (int i = 0; i <= count; i++) {
    switch (dummy) {
        case 0:
            dummy = 1;
            break;

        default:
            dummy = 0;
    }
}


for (int i = 0; i <= count; i++) {
    dummy = dummy == 0 ? 1 : 0;
}

 

البته این کار در یک حلقه دوم به منظور اندازه گیری میانگین زمانهای صرف شده برای اجرای دستور قرار خواهد گرفت. از آنجا که در هر لحظه فعل و انفعالات متعددی در سیستم عامل انجام میشود، جهت رسیدن به یک خروجی قابل اعتماد، هم مقدار تکرار حلقه باید بزرگ انتخاب شود و هم اینکه حتما از میانگین مقادیر استفاده گردد.

قالب کلی کلاس AsyncTask در قسمت دستور اجرایی به صورت ذیل خواهد بود:

private final int rounds = 100;

private long[] tEndIf = new long[rounds];
private long[] tEndSwitch = new long[rounds];
private long[] tEndIif = new long[rounds];

@Override
protected Object doInBackground(Object[] params) {
    int dummy = 0;

    for (int r = 0; r < rounds && !isCancelled(); r++) {
        publishProgress(String.format(Locale.US, "Round %d started.\n", r + 1));

        //if-else test
        long tStartIf = System.currentTimeMillis();
        for (int i = 0; i <= count && !isCancelled(); i++) {
            if (dummy == 0) {
                dummy = 1;
            } else {
                dummy = 0;
            }
        }
        tEndIf[r] = System.currentTimeMillis() - tStartIf;


        //switch test
        long tStartSwitch = System.currentTimeMillis();
        for (int i = 0; i <= count && !isCancelled(); i++) {
            switch (dummy) {
                case 0:
                    dummy = 1;
                    break;

                default:
                    dummy = 0;
            }
        }
        tEndSwitch[r] = System.currentTimeMillis() - tStartSwitch;

        //ternary test
        long tStartIif = System.currentTimeMillis();
        for (int i = 0; i <= count && !isCancelled(); i++) {

            dummy = dummy == 0 ? 1 : 0;

        }
        tEndIif[r] = System.currentTimeMillis() - tStartIif;
    }

    return null;
}

 

نتایج بدست آمده برای این آزمایش در 10000000*100  اجرا به صورت زیر است:

android-bench-condition

  • دستور Switch بیشترین زمان را مصرف میکند.
  • دستور If-else تا حدود 10 درصد از دستور Switch، سریعتر است.
  • دستور شرط سه گانه تا حدود 12 درصد از دستور Switch، سریعتر است.

 

در نتیجه کمترین زمان پردازش مربوط به دستور شرط سه گانه است.

در صورت تمایل به دریافت سورس کد کامل این آزمایش به نشانی این پروژه در github مراجعه نمایید. سورس این پروژه در آینده با بررسی دستورات دیگر کامل خواهد شد.

About محمد شمس

برنامه‌نویس، طراح انیمیشن و علاقمند به هوش مصنوعی

One Comment

  1. Very nice post here thanks for it I always like and search such topics and everything connected to them.Excellent and very cool idea and the subject at the top of magnificence and I am happy to comment on this topic through which we address the idea of positive reaction.

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *


× 6 = 30