سؤال
إخلاء المسؤولية:أنا لست خبير مترجم.أنا ببساطة غريبة وتأتي تسعى التنوير.
لقد رأيت الناس يدعون ذلك 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) انها أكثر وضوحا قليلا إلى ونيتياتد (ربما).
بالمناسبة ، في المثال المفتعل ، وظيفة "بلينكليد()" هو غريب ومريب-ستعمل ربما الانتظار في جميع أنحاء لتكون قادرة على رؤيتها على المضي قدما ، ثم قبالة.لذا فإن "الكفاءة" بعيدة بعض الشيء عن الطاولة.
ولكن ، بشكل عام ، بالنسبة لمعظم الأشياء ، تتعلق الكفاءة في الغالب بمدى سرعة ترميزها وأيضا (الأهم) مدى سرعة فهمها.