موسسه خیریه محک

شهر ریاضی بازی-ریاضی

استفاده از bool در شرط if سریع‌تر است یا int

+1 امتیاز
352 نمایش

استفاده از if(bool) سریع‌تر هست یا if(int)؟

هیچ پژوهش انسانی نمی‌تواند ادعای علمی بودن داشته باشد، مگر این‌که از برهان ریاضی برخوردار باشد (لئوناردو داوینچی)
پرسیده شده چهارشنبه ۲۳ مرداد ۱۳۹۲ در C++ توسط prodo  

1 پاسخ

0 امتیاز

دو قطعه کد زیر و در نظر بگیریم

int int_if(int x)
{
  if (x) return 0;
  else return 1;
}
int bool_if(bool b)
{
  if (b) return 0;
  else return 1;
}

وقتی این دو کد رو در حالت بهینه‌سازی که حالت پیش‌فرض همه‌ی کامپایلرها هست کامپایل کنیم دو کد زیر و به دست می‌آریم

pushl   %ebp
movl    %esp, %ebp
cmpl    $1, 8(%ebp)
popl    %ebp
sbbl    %eax, %eax
andb    $1, %al
addl    $0, %eax
ret

و

pushl   %ebp
movl    %esp, %ebp
cmpb    $1, 8(%ebp)
popl    %ebp
sbbl    %eax, %eax
andb    $1, %al
addl    $0, %eax
ret

که به جز cmpb و cmpl در هیچ جا با هم تفاوت ندارن و بنابراین سرعت اجرای دو کد در حالت بهینه شده برابر است.

اما اگه در حالت بدون بهینه‌سازی کد رو کامپایل کنیم بسته به کامپایلر معمولاً کدهای مختلفی به دست می‌آریم. مثلاً ممکنه در یک حالت کدهای زیر و به دست بیاریم

         pushl  %ebp
          movl  %esp, %ebp
          cmpl  $0, 8(%ebp)
          je    L2
          movl  $0, %eax
          jmp   L3
   L2:
          movl  $1, %eax
   L3:
          leave
          ret

و

          pushl %ebp
          movl  %esp, %ebp
          subl  $4, %esp
          movl  8(%ebp), %eax
          movb  %al, -4(%ebp)
          cmpb  $0, -4(%ebp)
          je    L5
          movl  $0, %eax
          jmp   L6
   L5:
          movl  $1, %eax
   L6:
          leave
          ret

که با هم فرق دارن بنابراین سرعت اجراشون متفاوته. بنابراین فقط در حالت بدون بهینه‌سازی (که فقط برای تست و بررسی هست نه تولید کد نهایی) کدها تفاوت داره.

این تفاوت طبیعی هست. زیرا در حالت بدون بهینه‌سازی کامپایلر تنها سعی می‌کنه کد رو به یه کد ماشین درست تبدیل کنه نه کاراتربن حالت ممکن. بنابراین برای bool و int که یک بایتی و چهاربایتی هستند، کدهای متفاوتی تولید می‌شه

هیچ پژوهش انسانی نمی‌تواند ادعای علمی بودن داشته باشد، مگر این‌که از برهان ریاضی برخوردار باشد (لئوناردو داوینچی)
پاسخ داده شده چهارشنبه ۲۳ مرداد ۱۳۹۲ توسط prodo