سؤال

إخلاء المسؤولية:أنا لست خبير مترجم.أنا ببساطة غريبة وتأتي تسعى التنوير.

لقد رأيت الناس يدعون ذلك efficiency من أجل الكفاءة -- for يجب أن تستخدم الحلقات عموما مقارنة صفرية للإنهاء.لذلك بدلا من:

void blink1(int n) {
    for (int i=0; i<n; i++) {
        blink_led();
    }
}

يجب أن تكتب:

void blink2(int n) {
    for (int i=n; i>0; i--) {
        blink_led();
    }
}

اعتقدت أن هذا كان سخيفا بعض الشيء:لماذا تضع العبء على الإنسان إذا كان المترجم يمكن أن يفسر كلتا الحالتين على أنها"وميض () مرات"?

ولكن باستخدام السيد.مستكشف مترجم جودبولت, ، أعتقد الآن أنني مخطئ.لجميع المجمعين حاولت ، و" مقارنة ضد الصفر " تنتج دائما حلقة أقصر.على سبيل المثال ، أنتجت إكس 86 - 64 غك 10.2 مع-أو 3 الأمثل الحلقات الداخلية التالية:

blink1:
    ...
.L3:
        xor     eax, eax
        add     ebx, 1
        call    blink_led
        cmp     ebp, ebx
        jne     .L3

مقابل

blink2:
    ...
.L12:
        xor     eax, eax
        call    blink_led
        sub     ebx, 1
        jne     .L12

إذن هذا هو السؤال

هذا يبدو وكأنه حالة شائعة.

لماذا لا يمكن (أو لماذا لا) لاحظ المترجم أن تأثير for حلقة هو ببساطة "افعل هذا الشيء مرات" -- سواء العد حتى أو العد التنازلي optimize وتحسين لذلك?

هل كانت مفيدة؟

المحلول

ما تقرأ هو محض هراء ، باستثناء الأكثر بدائية من المجمعين.أولا ، تكون المقارنة مع عدد صحيح بنفس السرعة ، وربما أسرع من المقارنة مع ثابت.ثانيا ، سوف مترجم الأمثل جيدة تأخذ حلقة مكتوبة باستخدام بعض نمط مشترك وتحويله إلى أفضل رمز ممكن;قد لا يتعرف على نمطك المشوش وينتج رمزا أقل جودة له.

وأخيرا ، يجب أن لا تحل محل قراءة مع رمز غير قابل للقراءة ما لم تكن هناك حاجة فعلية لذلك.إذا كنت تنفق ساعة إجراء التغيير ، فإنه يحتاج إلى إنتاج 20 ساعة حفظ الوقت وحدة المعالجة المركزية على الأقل.عندما تكون في هذا المستوى ، من المرجح جدا أن توفر الخوارزميات الأفضل مدخرات أفضل.

نصائح أخرى

أعتقد أنني أتفق في الغالب مع @ غناشر 729 ، ولكن هؤلاء الناس ما تقلق بشأن "الكفاءة" سوف ينتقد استخدام ل حلقة على الإطلاق-المتغير "أنا" لا يضيف أي شيء ...

لماذا لا:

void blink3(int n) {
    while (n-- > 0) {
       blink_led();
    }
}

لقد أضفت "> 0 " لعدة أسباب:1) فقط في حالة شخص ما يسأل عن كمية سلبية من وامض ، لا تريد أن لفة إلى الوراء لمدة 2 مليار مرة.2) انها أكثر وضوحا قليلا إلى ونيتياتد (ربما).

بالمناسبة ، في المثال المفتعل ، وظيفة "بلينكليد()" هو غريب ومريب-ستعمل ربما الانتظار في جميع أنحاء لتكون قادرة على رؤيتها على المضي قدما ، ثم قبالة.لذا فإن "الكفاءة" بعيدة بعض الشيء عن الطاولة.

ولكن ، بشكل عام ، بالنسبة لمعظم الأشياء ، تتعلق الكفاءة في الغالب بمدى سرعة ترميزها وأيضا (الأهم) مدى سرعة فهمها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى cs.stackexchange
scroll top