কোনটি দ্রুত: যদি (bool) বা (int) হয়?


94

কোন মান ব্যবহার করা ভাল? বুলিয়ান সত্য নাকি পূর্ণসংখ্যা 1?

উপরে বিষয়ে আমার সাথে কিছু পরীক্ষা-নিরীক্ষা করতে বাধ্য করেছে boolএবং intifঅবস্থা। তাই কৌতূহলের বাইরে আমি এই প্রোগ্রামটি লিখেছিলাম:

int f(int i) 
{
    if ( i ) return 99;   //if(int)
    else  return -99;
}
int g(bool b)
{
    if ( b ) return 99;   //if(bool)
    else  return -99;
}
int main(){}

g++ intbool.cpp -S প্রতিটি ফাংশনের জন্য নীচে asm কোড উত্পন্ন করে:

  • জন্য asm কোড f(int)

    __Z1fi:
       LFB0:
             pushl  %ebp
       LCFI0:
              movl  %esp, %ebp
       LCFI1:
              cmpl  $0, 8(%ebp)
              je    L2
              movl  $99, %eax
              jmp   L3
       L2:
              movl  $-99, %eax
       L3:
              leave
       LCFI2:
              ret
    
  • জন্য asm কোড g(bool)

    __Z1gb:
       LFB1:
              pushl %ebp
       LCFI3:
              movl  %esp, %ebp
       LCFI4:
              subl  $4, %esp
       LCFI5:
              movl  8(%ebp), %eax
              movb  %al, -4(%ebp)
              cmpb  $0, -4(%ebp)
              je    L5
              movl  $99, %eax
              jmp   L6
       L5:
              movl  $-99, %eax
       L6:
              leave
       LCFI6:
              ret
    

আশ্চর্যজনকভাবে, g(bool)আরও asmনির্দেশাবলী উত্পন্ন ! এর অর্থ কি এর if(bool)চেয়ে সামান্য ধীর if(int)? আমি মনে করি boolবিশেষত শর্তাধীন বিবৃতিতে ব্যবহারের জন্য ডিজাইন করা হয়েছে if, সুতরাং আমি g(bool)কম asm নির্দেশাবলী উত্পন্ন করার আশা করছিলাম , যার ফলে g(bool)আরও দক্ষ এবং দ্রুত তৈরি করা হবে।

সম্পাদনা:

আমি এখন পর্যন্ত কোনও অপ্টিমাইজেশন পতাকা ব্যবহার করছি না। তবে এটির অনুপস্থিতি, কেন এটি আরও asm তৈরি করে g(bool)এমন একটি প্রশ্ন যা আমি যুক্তিসঙ্গত উত্তর খুঁজছি। আমার এও আপনাকে বলা উচিত যে -O2অপ্টিমাইজেশান পতাকা ঠিক একই asm উত্পন্ন করে। তবে প্রশ্নটি নয়। প্রশ্ন আমি কি জিজ্ঞাসা করেছি।



32
যদি আপনি তাদেরকে যুক্তিসঙ্গত অপ্টিমাইজেশান সক্ষম করার সাথে তুলনা করেন তবে এটিও একটি অন্যায্য পরীক্ষা।
ড্যানিয়েল প্রাইডেন

9
@ ড্যানিয়েল: আমি তাদের কোনওটির সাথে কোনও অপ্টিমাইজেশন পতাকা ব্যবহার করছি না। তবে এটির অনুপস্থিতি, কেন এটি আরও asm তৈরি করে g(bool)এমন একটি প্রশ্ন যা আমি যুক্তিসঙ্গত উত্তর খুঁজছি।
নওয়াজ

8
আপনি কেন asm পড়ার সমস্যায় পড়বেন, তবে কেবল প্রোগ্রামটি চালাচ্ছেন না এবং ফলাফলের সময়ক্ষণ করছেন ? শিক্ষণীয় সংখ্যাটি পারফরম্যান্স সম্পর্কে সত্যই বেশি কিছু বলে না। আপনাকে কেবল নির্দেশের দৈর্ঘ্যই নয়, নির্ভরতা এবং নির্দেশনার ধরণগুলিও ফ্যাক্ট করতে হবে (এর মধ্যে কয়েকটি ধীরে ধীরে মাইক্রোকোড পথ ব্যবহার করে ডিকোড করা হয়েছে, কোনটি এক্সিকিউশন ইউনিট তাদের প্রয়োজন, নির্দেশের দীর্ঘসূত্রতা এবং থ্রুটপুট কী) শাখা? একটি স্মরণীয় প্রবেশাধিকার?
জাল্ফ

4
@ ব্যবহারকারী অজানা, এবং @ মালভোলিও: এটি স্পষ্টতই; আমি প্রোডাকশন কোডের জন্য এগুলি করছি না। আমি ইতিমধ্যে আমার পোস্টের শুরুতে উল্লেখ করেছি যে "কৌতুহলের বাইরে আমি এই প্রোগ্রামটি লিখেছিলাম" । হ্যাঁ, এটি একটি সম্পূর্ণ অনুমানমূলক
নওয়াজ

4
এটি একটি বৈধ প্রশ্ন। তারা হয় সমতুল্য বা একটি দ্রুত। এএসএম সম্ভবত সহায়ক হতে বা উচ্চস্বরে চিন্তা করার প্রয়াসে পোস্ট করা হয়েছিল, সুতরাং প্রশ্নটি ফাঁসানোর উপায় হিসাবে এটি ব্যবহার না করে "কেবল পঠনযোগ্য কোড লিখুন" বলুন, কেবল প্রশ্নের উত্তর দিন বা এসটিএফইউ যদি আপনি না জানেন তবে বা বলার মতো দরকারী কোনও ব্যবহার করবেন না;) আমার অবদান হ'ল প্রশ্নটি উত্তরযোগ্য, এবং "কেবল পঠনযোগ্য কোড লিখুন" প্রশ্নের ডোজিং ছাড়া কিছুই নয়।
ত্রিয়ঙ্কো

উত্তর:


99

আমার কাছে যৌক্তিক. আপনার সংকলক স্পষ্টতই boolএকটি 8-বিট মান হিসাবে সংজ্ঞা দেয় এবং আপনার সিস্টেম এবিআই কল স্ট্যাকের দিকে ধাক্কা দেওয়ার সময় 32 (বিট) ছোট (<32-বিট) পূর্ণসংখ্যার যুক্তিগুলিকে "প্রচার" করতে পারে to সুতরাং একটি তুলনা করতে bool, সংকলক জি প্রাপ্ত 32-বিট আর্গুমেন্টের নূন্যতম উল্লেখযোগ্য বাইটকে আলাদা করার জন্য কোড উত্পন্ন করে এবং এর সাথে তুলনা করে cmpb। প্রথম উদাহরণে, intযুক্তিটি পুরো 32 টি বিট ব্যবহার করে যা স্ট্যাকের উপরে চাপানো হয়েছিল, সুতরাং এটি কেবল পুরো জিনিসের সাথে তুলনা করে cmpl


4
আমি রাজী. এটি আলোকিত করতে সহায়তা করে যে কোনও চলক ধরণের চয়ন করার সময়, আপনি এটি দুটি সম্ভাব্য প্রতিযোগিতামূলক উদ্দেশ্যে, স্টোরেজ স্পেস বনাম গণনাগত কার্য সম্পাদনের জন্য বেছে নিচ্ছেন।
ট্রিইঙ্কো

4
এটিও কি 64৪-বিট প্রক্রিয়াগুলিতে প্রযোজ্য, __int64এটির চেয়ে দ্রুত int? অথবা সিপিইউ 32-বিট ইন্ডিগ্রেশনটি আলাদাভাবে 32-বিট নির্দেশিকা সেট করে?
ক্রাইং কিং

4
@ ক্রেন্ডকিং সম্ভবত এটি আরও একটি প্রশ্ন ঘূর্ণায়মান?
নাম

81

সংকলন -03আমার জন্য নিম্নলিখিত দেয়:

চ:

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

ছ:

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

.. সুতরাং এটি cmplবনাম বাদে মূলত একই কোডটি সংকলন করে cmpb। এর অর্থ হ'ল পার্থক্যটি যদি কিছু থাকে তবে কিছু যায় আসে না। অপরিশোধিত কোড দ্বারা বিচার করা ন্যায়সঙ্গত নয়।


আমার বক্তব্য স্পষ্ট করতে সম্পাদনা করুন । আনপটিমাইজড কোডটি সাধারণ ডিবাগিংয়ের জন্য, গতির জন্য নয়। অপরিশোধিত কোডের গতির তুলনা করা বোকামি।


8
আমি আপনার উপসংহারের সাথে যতটা সম্মত, আমি মনে করি আপনি আকর্ষণীয় অংশটি এড়িয়ে যাচ্ছেন। কেন এটি cmplএকের cmpbজন্য এবং অন্যটির জন্য ব্যবহার করে?
জাল্ফ

22
@ জালফ: কারণ boolএ একটি একক বাইট এবং একটি intচারটি। আমি মনে করি না এর চেয়ে বিশেষ কিছু আছে।
সিবি বেইলি

7
আমি মনে করি যে অন্যান্য প্রতিক্রিয়াগুলি কারণগুলিতে বেশি মনোযোগ দিয়েছে: এটি কারণ যে প্রশ্নে প্ল্যাটফর্মটি boolএকটি 8 বিট প্রকার হিসাবে বিবেচনা করে ।
আলেকজান্ডার গেসলার

9
@ নাথান: নং সি ++ এর কোনও বিট ডেটা ধরণের নেই। সবচেয়ে ছোট প্রকারটি হ'ল charযা সংজ্ঞা অনুসারে একটি বাইট এবং এটি সবচেয়ে ছোট ঠিকানাযোগ্য ইউনিট। boolএর আকার বাস্তবায়ন-সংজ্ঞায়িত, এবং 1, 4, 8 বা 8 বা যা কিছু হতে পারে। সংকলকরা এটির একটি তৈরি করার প্রবণতা রয়েছে।
GManNickG

6
@ নাথান: আচ্ছা, জাভাতেও এটি মুশকিল। জাভা বলেছেন যে বুলিয়ান ডেটা উপস্থাপন করে তা হ'ল এক বিটের মান, তবে কীভাবে সেই বিটটি সংরক্ষণ করা হয় তা এখনও বাস্তবায়ন সংজ্ঞায়িত। ব্যবহারিক কম্পিউটারগুলি কেবল বিটগুলিকে সম্বোধন করে না।
GManNickG

26

আমি যখন বিকল্পগুলির একটি বুদ্ধিমান সেট (বিশেষত -O3) দিয়ে এটি সংকলন করি তখন আমি যা পাই তা এখানে:

এর জন্য f():

        .type   _Z1fi, @function
_Z1fi:
.LFB0:
        .cfi_startproc
        .cfi_personality 0x3,__gxx_personality_v0
        cmpl    $1, %edi
        sbbl    %eax, %eax
        andb    $58, %al
        addl    $99, %eax
        ret
        .cfi_endproc

এর জন্য g():

        .type   _Z1gb, @function
_Z1gb:
.LFB1:
        .cfi_startproc
        .cfi_personality 0x3,__gxx_personality_v0
        cmpb    $1, %dil
        sbbl    %eax, %eax
        andb    $58, %al
        addl    $99, %eax
        ret
        .cfi_endproc

তারা এখনও তুলনা করার জন্য বিভিন্ন নির্দেশাবলী ব্যবহার করে ( cmpbবুলিয়ান বনাম ইন ইন্টের cmplজন্য), তবে অন্যথায় মৃতদেহগুলি অভিন্ন। ইন্টেল ম্যানুয়ালগুলিতে একটি তাত্ক্ষণিকভাবে আমাকে জানায়: ... কিছুই খুব বেশি নয়। ইন্টেল ম্যানুয়ালগুলিতে cmpbবা তেমন কোনও জিনিস নেই cmpl। এগুলি সবই cmpএবং এই মুহুর্তে আমি সময় সারণীগুলি খুঁজে পাই না। তবে আমি অনুমান করছি যে বাইট অবিলম্বে বনাম তুলনা করার সাথে কোনও দীর্ঘ তাত্ক্ষণিক তুলনা করার মধ্যে কোনও ঘড়ির পার্থক্য নেই, সুতরাং সমস্ত ব্যবহারিক উদ্দেশ্যে কোডটি অভিন্ন।


আপনার সংযোজনের ভিত্তিতে নিম্নলিখিতটি যুক্ত করতে সম্পাদিত

অপ্রচলিত ক্ষেত্রে কোডটি পৃথক হওয়ার কারণটি হ'ল এটি বিনা চাপে। (হ্যাঁ, এটি বিজ্ঞপ্তি, আমি জানি।) যখন সংকলকটি এএসটি চলে এবং সরাসরি কোড উত্পন্ন করে তখন এটিটি এটিএসের তাত্ক্ষণিক বিন্দুতে যা আছে তা ছাড়া কিছুই "জানে" না। সেই সময়ে এটিতে প্রয়োজনীয় সমস্ত প্রাসঙ্গিক তথ্য নেই এই নির্দিষ্ট সময়ে এটি ঘোষিত প্রকারটিকে boolহিসাবে বিবেচনা করতে পারে তা জানতে int। একটি বুলিয়ান স্পষ্টতই বাইট হিসাবে গণ্য হয় এবং ইন্টেল বিশ্বে বাইটগুলি চালিত করার সময় আপনি এটি স্ট্যাকের উপরে রাখার জন্য নির্দিষ্ট প্রস্থে আনার জন্য সাইন-এক্সটেন্ডের মতো কাজগুলি করতে হবে (আপনি কোনও বাইট চাপতে পারবেন না) ।)

অপ্টিমাইজার যখন এএসটি দেখে এবং এর যাদু করে, তবে এটি পার্শ্ববর্তী প্রেক্ষাপটে দেখে এবং "জানে" যখন শব্দার্থবিজ্ঞান পরিবর্তন না করে কোডকে আরও কার্যকর কিছু দিয়ে প্রতিস্থাপন করতে পারে। সুতরাং এটি "জানে" এটি প্যারামিটারে একটি পূর্ণসংখ্যা ব্যবহার করতে পারে এবং এর ফলে অপ্রয়োজনীয় রূপান্তর এবং প্রশস্তকরণ হারাতে পারে।


4
হাহাহা, আমি পছন্দ করি যে সংকলকটি কেবল কীভাবে 99, বা 99 + 58 = 157 = -99 (স্বাক্ষরিত 8 বিটগুলির ওভারফ্লো) ফিরিয়ে দিয়েছে ... আকর্ষণীয়।
মিথ্যাচারিত ক্যাভিয়ার

@ ড্যানিয়েল: এমনকি আমি এটি পছন্দ করেছি। প্রথমে আমি বলেছিলাম "কোথায় -৯৯" এবং তত্ক্ষণাত আমি বুঝতে পেরেছিলাম যে এটি খুব মাতাল কিছু করছে।
নওয়াজ

7
lএবং bকেবল এটিএন্ডটি টি সিন্ট্যাক্সে প্রত্যয় ব্যবহৃত হয়। তারা cmpযথাক্রমে 4 বাইট (দীর্ঘ) এবং 1 বাইট (বাইট) অপারেশন ব্যবহারের সংস্করণগুলি উল্লেখ করে। কোথায় ইন্টেল সিনট্যাক্স কোনো অস্পষ্টতা নেই, সাধারনত মেমরির প্রতীক দিয়ে ট্যাগ করা হয় BYTE PTR, WORD PTRবা DWORD PTRপরিবর্তে opcode উপর একটি প্রত্যয় নির্বাণ।
সিবি বেইলি

সময় সারণী: agner.org/ অপ্টিমাইজ উভয় অপারেন্ড-আকার cmpএকই কর্মক্ষমতা আছে, এবং পড়ার জন্য কোন আংশিক-নিবন্ধ জরিমানা আছে %dil। (তবে এটি and99 এবং -99 এর মধ্যে শাখাবিহীন কেস-ফ্লিপিংয়ের অংশ হিসাবে আ’লীগের বাইট-সাইজ ব্যবহার করে মজাদারভাবে আংশিক-নিবন্ধক স্টল তৈরি করা বাধা দেয় না ))
পিটার কর্ডেস

13

কমপক্ষে লিনাক্স এবং উইন্ডোজে জিসিসি 4.5 সহ sizeof(bool) == 1,। X86 এবং x86_64 এ, আপনি কোনও সাধারণ উদ্দেশ্যে নিবন্ধের কোনও ফাংশনে (স্ট্যাক বা কলিং কনভেনশন ইত্যাদির উপর নির্ভর করে কোনও রেজিস্ট্রারের মাধ্যমে ...) এর চেয়ে কম পাস করতে পারবেন না।

সুতরাং বুলের কোডটি যখন অপ-অপ্টিমাইজড হয় তখন আর্গুমেন্ট স্ট্যাক থেকে সেই বুলি মানটি বের করতে আসলে কিছুটা দৈর্ঘ্যে যায় (সেই বাইটটি সংরক্ষণ করতে অন্য স্ট্যাক স্লট ব্যবহার করে)। এটি কেবল নেটিভ রেজিস্ট্রার-আকারের ভেরিয়েবলটি টানানোর চেয়ে জটিল।


সি ++ 03 স্ট্যান্ডার্ড থেকে, §5.3.3 / 1: " sizeof(bool)এবং sizeof(wchar_t)বাস্তবায়ন-সংজ্ঞায়িত করা হয়েছে। " সুতরাং sizeof(bool) == 1আপনি যদি কোনও নির্দিষ্ট সংকলকটির একটি নির্দিষ্ট সংস্করণ সম্পর্কে কথা না বলছেন তবে বলা শক্তভাবে সঠিক নয়।
iljarn

9

মেশিন পর্যায়ে বুলের মতো জিনিস নেই

খুব কম ইন্সট্রাকশন সেট আর্কিটেকচারগুলি কোনও ধরণের বুলিয়ান অপরেন্ড টাইপকে সংজ্ঞায়িত করে, যদিও প্রায়শই এমন নির্দেশাবলী পাওয়া যায় যা শূন্য-অমূল্যের উপর ক্রিয়া চালায়। সিপিইউ-তে সাধারণত, সমস্ত কিছু স্কেলারের একটি বা তার একটি স্ট্রিং।

একটি প্রদত্ত কম্পাইলার এবং একটি প্রদত্ত ABI- র জন্য নির্দিষ্ট মাপ নির্বাচন করতে হবে intএবং boolএবং কখন, আপনার ক্ষেত্রে মত, এই বিভিন্ন মাপের তারা কিছুটা ভিন্ন কোড জেনারেট পারে, এবং অপ্টিমাইজেশান এক কিছু মাত্রা কাছে একটু দ্রুততর হতে পারে।

কেন অনেক সিস্টেমে বুল এক বাইট হয়?

charবুলের জন্য কোনও প্রকার চয়ন করা আরও নিরাপদ কারণ যে কেউ তাদের মধ্যে সত্যিই বড় অ্যারে তৈরি করতে পারে।

আপডেট করুন: দ্বারা "নিরাপদ", আমি বলতে চাচ্ছি: কম্পাইলার ও লাইব্রেরি প্রয়োগকারীরা জন্য। আমি বলছি না যে লোকেদের সিস্টেমের ধরণটি পুনরায় প্রয়োগ করা দরকার।


4
+1 x86 এ ওভারহেডটি কল্পনা করুন যদি boolবিট দ্বারা প্রতিনিধিত্ব করা হয়; সুতরাং বাইট অনেক বাস্তবায়নে গতি / ডেটা কমপ্যাক্টনেস জন্য একটি দুর্দান্ত ট্রেড অফ হবে।
হার্ডম্যাথ

4
@Billy: আমার মনে হয় তিনি বলছিলেন "ব্যবহার charপরিবর্তে boolকিন্তু এর পরিবর্তে কেবল ব্যবহার করা" " charপ্রকার" মানে "1 বাইট" যখন জন্য মাপ কম্পাইলার তা চয়ন উল্লেখ boolবস্তু।
ডেনিস জিকিফুজ

ওহ, অবশ্যই, আমি প্রতিটি প্রোগ্রাম বেছে নেওয়া উচিত তা বোঝাতে চাইছিলাম না, সিস্টেম বুলের ধরণটি 1 বাইট কেন হয় তার জন্য আমি কেবল একটি যুক্তি অগ্রসর করছিলাম।
ডিজিটালরোস

@ ডেনিস: আহ, তা বোঝা যায়।
বিলি ওনিল

7

হ্যাঁ, আলোচনার মজা। তবে কেবল এটি পরীক্ষা করুন:

পরীক্ষার কোড:

#include <stdio.h>
#include <string.h>

int testi(int);
int testb(bool);
int main (int argc, char* argv[]){
  bool valb;
  int  vali;
  int loops;
  if( argc < 2 ){
    return 2;
  }
  valb = (0 != (strcmp(argv[1], "0")));
  vali = strcmp(argv[1], "0");
  printf("Arg1: %s\n", argv[1]);
  printf("BArg1: %i\n", valb ? 1 : 0);
  printf("IArg1: %i\n", vali);
  for(loops=30000000; loops>0; loops--){
    //printf("%i: %i\n", loops, testb(valb=!valb));
    printf("%i: %i\n", loops, testi(vali=!vali));
  }
  return valb;
}

int testi(int val){
  if( val ){
    return 1;
  }
  return 0;
}
int testb(bool val){
  if( val ){
    return 1;
  }
  return 0;
}

একটি 64-বিট উবুন্টু 10.10 এর সাথে ল্যাপটপে সংকলিত: g ++ -O3 -o / tmp / test_i /tmp/test_i.cpp

পূর্ণসংখ্যার ভিত্তিক তুলনা:

sauer@trogdor:/tmp$ time /tmp/test_i 1 > /dev/null

real    0m8.203s
user    0m8.170s
sys 0m0.010s
sauer@trogdor:/tmp$ time /tmp/test_i 1 > /dev/null

real    0m8.056s
user    0m8.020s
sys 0m0.000s
sauer@trogdor:/tmp$ time /tmp/test_i 1 > /dev/null

real    0m8.116s
user    0m8.100s
sys 0m0.000s

বুলিয়ান পরীক্ষা / মুদ্রণ নিরবিচ্ছিন্ন (এবং পূর্ণসংখ্যা মন্তব্য করেছে):

sauer@trogdor:/tmp$ time /tmp/test_i 1 > /dev/null

real    0m8.254s
user    0m8.240s
sys 0m0.000s
sauer@trogdor:/tmp$ time /tmp/test_i 1 > /dev/null

real    0m8.028s
user    0m8.000s
sys 0m0.010s
sauer@trogdor:/tmp$ time /tmp/test_i 1 > /dev/null

real    0m7.981s
user    0m7.900s
sys 0m0.050s

1 অ্যাসাইনমেন্ট এবং 2 টি লুপের সাথে প্রতিটি লুপের তুলনায় 2 টি একই They অনুকূলকরণের জন্য আরও কিছু সন্ধান করুন। উদাহরণস্বরূপ, অকারণে strcmp ব্যবহার করবেন না। ;)


2

এটি বেশিরভাগই সংকলক এবং অপ্টিমাইজেশনের উপর নির্ভর করবে। এখানে একটি আকর্ষণীয় আলোচনা রয়েছে (ভাষা অজ্ঞাব্য ভাষায়):

"যদি ([bool] == সত্য)" "যদি ([bool])" এর চেয়ে আরও একটি ধাপ প্রয়োজন?

এছাড়াও, এই পোস্টটি একবার দেখুন: http://www.linuxquestions.org/questions/programming-9/c-compiler-handling-of-boolean-variables-290996/


0

আপনার প্রশ্ন দুটি ভিন্ন উপায়ে পৌঁছনো:

আপনি যদি বিশেষত সি ++ বা কোনও প্রোগ্রামিং ভাষার বিষয়ে কথা বলছেন যা এই বিষয়টির জন্য এসেম্বলি কোড তৈরি করে, আমরা ASM এ সংকলকটি কোন কোডটি উত্পন্ন করবে সে সম্পর্কে আমরা আবদ্ধ। আমরা সি ++ তে সত্য এবং মিথ্যা উপস্থাপনের জন্যও আবদ্ধ। একটি পূর্ণসংখ্যা 32 বিটের মধ্যে সংরক্ষণ করতে হবে, এবং আমি কেবল বুলিয়ান এক্সপ্রেশন সংরক্ষণ করতে একটি বাইট ব্যবহার করতে পারি। শর্তাধীন বিবৃতিগুলির জন্য এএসএম স্নিপেটস:

পূর্ণসংখ্যার জন্য:

  mov eax,dword ptr[esp]    ;Store integer
  cmp eax,0                 ;Compare to 0
  je  false                 ;If int is 0, its false
  ;Do what has to be done when true
false:
  ;Do what has to be done when false

বিলের জন্য:

  mov  al,1     ;Anything that is not 0 is true
  test al,1     ;See if first bit is fliped
  jz   false    ;Not fliped, so it's false
  ;Do what has to be done when true
false:
  ;Do what has to be done when false

সুতরাং, গতির তুলনা এতটাই সঙ্কলিত নির্ভর। উপরের ক্ষেত্রে, বুলটি সামান্য দ্রুত হবে কারণ cmpপতাকাগুলি সেট করার জন্য বিয়োগকে বোঝানো হবে। এটি আপনার সংকলকটি কী উত্পন্ন করেছে তার সাথেও তার বিরোধিতা করে।

আর একটি পদ্ধতির, যা খুব সহজ একটি তা হ'ল নিজের মত প্রকাশের যুক্তিটি দেখার জন্য এবং সংকলকটি আপনার কোডটি কীভাবে অনুবাদ করবে তা নিয়ে চিন্তা করার চেষ্টা করবেন না এবং আমি মনে করি এটি চিন্তার অনেক স্বাস্থ্যকর উপায়। আমি এখনও বিশ্বাস করি, শেষ পর্যন্ত, যেটি সংকলক দ্বারা উত্পন্ন কোডটি আসলে একটি সত্যবাদী রেজোলিউশন দেওয়ার চেষ্টা করছে। আমার অর্থ হ'ল, যদি আপনি যদি স্টেট স্টেটমেন্টে টেস্ট কেসগুলি বৃদ্ধি করেন এবং একদিকে বুলিয়ান এবং অন্যদিকে পূর্ণসংখ্যার সাথে আঁকেন তবে সংকলকটি এটি তৈরি করবে যাতে উত্পন্ন কোডটি মেশিন স্তরে বুলিয়ান এক্সপ্রেশনগুলির সাথে দ্রুত কার্যকর করা হবে।

আমি এটি একটি ধারণামূলক প্রশ্ন বিবেচনা করছি, তাই আমি একটি ধারণামূলক উত্তর দেব। এই আলোচনাটি আমাকে আলোচনার স্মরণ করিয়ে দেয় যে আমি কোড কার্যকারিতা অ্যাসেমব্লিতে কম লাইনের কোডে অনুবাদ করি কিনা। দেখে মনে হয় এই ধারণাটি সাধারণত সত্য হিসাবে গ্রহণযোগ্য। ALU প্রতিটি বিবৃতি কতটা দ্রুত পরিচালনা করবে তা ট্র্যাক করে রাখা বিবেচনা করা, দ্বিতীয় বিকল্পটি জাম্পগুলিতে মনোনিবেশ করা এবং সমাবেশে তুলনা করা। যখন এটি হয়, আপনি উপস্থাপিত কোডটিতে বুলিয়ান বিবৃতি বা পূর্ণসংখ্যার মধ্যে পার্থক্য বরং প্রতিনিধিত্বশীল হয়ে ওঠে। সি ++ তে প্রকাশের ফলাফলটি এমন একটি মান ফেরত দেবে যা তারপরে একটি প্রতিনিধিত্ব দেওয়া হবে। অন্যদিকে সমাবেশে, আপনি যদি সি ++ এ বিবৃতিতে আবার কী ধরণের অভিব্যক্তি ফিরে আসেন তা নির্বিশেষে জাম্পগুলি এবং তুলনাগুলি সংখ্যাসূচক মানের উপর ভিত্তি করে তৈরি করা হবে। এই প্রশ্নগুলির উপর এটি গুরুত্বপূর্ণ যে এটি সম্পূর্ণরূপে যুক্তিযুক্ত বিবৃতিগুলি যেমন একটি বৃহত গণনামূলক ওভারহেড সহ শেষ হয়, যদিও একক বিট একই জিনিসটির পক্ষে সক্ষম হবে তা মনে রাখা গুরুত্বপূর্ণ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.