কোনটি দ্রুত: যখন (1) বা যখন (2)?


587

এটি একটি সিনিয়র ম্যানেজার দ্বারা জিজ্ঞাসা করা একটি সাক্ষাত্কারের প্রশ্ন ছিল।

কোনটি দ্রুত?

while(1) {
    // Some code
}

অথবা

while(2) {
    //Some code
}

আমি বলেছিলাম যে উভয়েরই একই প্রয়োগের গতি রয়েছে, কারণ অভ্যন্তরের অভিব্যক্তিটি whileশেষ পর্যন্ত মূল্যায়ন করা উচিত trueবা উচিত false। এই ক্ষেত্রে, উভয়ই মূল্যায়ন করে trueএবং শর্তের ভিতরে কোনও অতিরিক্ত শর্তসাপেক্ষ নির্দেশনা নেই while। সুতরাং, উভয়েরই কার্যকর করার গতি থাকবে এবং আমি পছন্দ করি (1)।

তবে সাক্ষাত্কারকারী আত্মবিশ্বাসের সাথে বলেছিলেন: "আপনার বেসিকগুলি পরীক্ষা করুন while(1)than এর চেয়ে দ্রুত is while(2)" (তিনি আমার আত্মবিশ্বাসের পরীক্ষা নিচ্ছেন না)

এটা কি সত্য?

আরও দেখুন: "((;;))" "যখন" (সত্য) এর চেয়ে দ্রুত "? যদি তা না হয় তবে লোকেরা কেন এটি ব্যবহার করবে?


202
একটি অর্ধ-শালীন সংকলক উভয় ফর্মকে কিছুতেই অনুকূল করবে না।

64
প্রতিবার (এন), এন! = 0 বা (;;) এর জন্য অপ্টিমাইজড বিল্ডটি প্রথমদিকে লেবেল সহ শেষ পর্যন্ত গেটো সহ অ্যাসেমব্লীল অন্তহীন লুপে অনুবাদ করা হবে। ঠিক একই কোড, একই কর্মক্ষমতা।
অ্যালেক্স এফ

60
অবাক হওয়ার মতো বিষয় নয়, একটি স্টক অপ্টিমাইজ করে উভয় স্নিপেটের 0x100000f90: jmp 0x100000f90জন্য (ঠিকানা পরিবর্তিত হয়, স্পষ্টতই) । সাক্ষাত্কারকারক সম্ভবত একটি রেজিস্টার পরীক্ষা বনাম একটি সাধারণ পতাকাযুক্ত জাম্পে হেজেড। প্রশ্ন এবং তাদের অনুমান উভয়ই লম্পট।
হুজক্রাইজ

50
সাক্ষাত্কারকারীর এই প্রশ্নটি dilbert.com / স্ট্রিপস / কমিক / ১৯৯ -11 -১১-১ as এর একই অধীনে আসে - আপনি এমন একজনের সাথে সাক্ষাত করবেন যিনি সত্যই বিশ্বাস করেন যে তারা কী বলেছে তাদের বক্তব্যটির বোকামির বিন্দু বাদে । কেবল নিম্নলিখিত থেকে বেছে নিন: একটি গভীর শ্বাস, শপথ, হাসি, কান্নাকাটি, উপরের কিছু সংমিশ্রণ :)
GMasucci

3
@ মাইক ডাব্লু: একটি কম্পাইলারের কী করা উচিত তা ভাবতে পারেন: একটি হ্যাল্ট স্টেটমেন্ট অনুবাদ করুন, বা বিবেচনা করুন যে লুপটি অসীম সময়ের পরে প্রস্থান করে এবং অসীম বিলম্বকে অপ্টিমাইজ করে?
ইয়ভেস দাউস্ট

উত্তর:


681

উভয় লুপগুলি অসীম, তবে আমরা দেখতে পাচ্ছি কোনটি পুনরাবৃত্তিতে আরও নির্দেশাবলী / সংস্থান গ্রহণ করে।

জিসিসি ব্যবহার করে, নিম্নলিখিত দুটি প্রোগ্রাম সংবিধানে বিভিন্ন স্তরের অপ্টিমাইজেশনের সংকলন করেছি:

int main(void) {
    while(1) {}
    return 0;
}


int main(void) {
    while(2) {}
    return 0;
}

এমনকি কোনও অপ্টিমাইজেশন ( -O0) না পেয়েও উত্পন্ন সমাবেশটি উভয় প্রোগ্রামের জন্য অভিন্নসুতরাং, দুটি লুপের মধ্যে কোনও গতির পার্থক্য নেই।

রেফারেন্সের জন্য, এখানে উত্পন্ন সমাবেশ ( gcc main.c -S -masm=intelএকটি অপ্টিমাইজেশন পতাকা ব্যবহার করে ):

সহ -O0:

    .file   "main.c"
    .intel_syntax noprefix
    .def    __main; .scl    2;  .type   32; .endef
    .text
    .globl  main
    .def    main;   .scl    2;  .type   32; .endef
    .seh_proc   main
main:
    push    rbp
    .seh_pushreg    rbp
    mov rbp, rsp
    .seh_setframe   rbp, 0
    sub rsp, 32
    .seh_stackalloc 32
    .seh_endprologue
    call    __main
.L2:
    jmp .L2
    .seh_endproc
    .ident  "GCC: (tdm64-2) 4.8.1"

সহ -O1:

    .file   "main.c"
    .intel_syntax noprefix
    .def    __main; .scl    2;  .type   32; .endef
    .text
    .globl  main
    .def    main;   .scl    2;  .type   32; .endef
    .seh_proc   main
main:
    sub rsp, 40
    .seh_stackalloc 40
    .seh_endprologue
    call    __main
.L2:
    jmp .L2
    .seh_endproc
    .ident  "GCC: (tdm64-2) 4.8.1"

সহ -O2এবং -O3(একই আউটপুট):

    .file   "main.c"
    .intel_syntax noprefix
    .def    __main; .scl    2;  .type   32; .endef
    .section    .text.startup,"x"
    .p2align 4,,15
    .globl  main
    .def    main;   .scl    2;  .type   32; .endef
    .seh_proc   main
main:
    sub rsp, 40
    .seh_stackalloc 40
    .seh_endprologue
    call    __main
.L2:
    jmp .L2
    .seh_endproc
    .ident  "GCC: (tdm64-2) 4.8.1"

প্রকৃতপক্ষে, লুপের জন্য উত্পন্ন সমাবেশটি প্রতিটি স্তরের অপ্টিমাইজেশনের জন্য একরকম:

 .L2:
    jmp .L2
    .seh_endproc
    .ident  "GCC: (tdm64-2) 4.8.1"

গুরুত্বপূর্ণ বিট হচ্ছে:

.L2:
    jmp .L2

আমি সমাবেশ খুব ভালভাবে পড়তে পারি না, তবে এটি অবশ্যই একটি শর্তহীন লুপ। jmpনির্দেশ নিঃশর্তভাবে প্রোগ্রাম ফিরে রিসেট .L2এমনকি সত্য বিরুদ্ধে একটি মান তুলনা ছাড়া লেবেল, এবং যতক্ষণ প্রোগ্রাম একরকম সমাপ্ত হলে অবশ্যই অবিলম্বে তাই আবার আছে। এটি সরাসরি সি / সি ++ কোডের সাথে মিলে যায়:

L2:
    goto L2;

সম্পাদনা:

আকর্ষণীয়ভাবে যথেষ্ট, এমনকি কোনও অপ্টিমাইজেশন ছাড়াই , নিম্নলিখিত লুপগুলি jmpসমাবেশে সঠিক একই আউটপুট (নিঃশর্ত ) উত্পাদন করেছিল:

while(42) {}

while(1==1) {}

while(2==2) {}

while(4<7) {}

while(3==3 && 4==4) {}

while(8-9 < 0) {}

while(4.3 * 3e4 >= 2 << 6) {}

while(-0.1 + 02) {}

এমনকি আমার বিস্ময়েও:

#include<math.h>

while(sqrt(7)) {}

while(hypot(3,4)) {}

ব্যবহারকারীর দ্বারা সংজ্ঞায়িত ফাংশনগুলির সাথে বিষয়গুলি আরও কিছু আকর্ষণীয় হয়ে উঠবে:

int x(void) {
    return 1;
}

while(x()) {}


#include<math.h>

double x(void) {
    return sqrt(7);
}

while(x()) {}

-O0, এই দুটি উদাহরণ প্রকৃতপক্ষে কল করে xএবং প্রতিটি পুনরাবৃত্তির জন্য একটি তুলনা সম্পাদন করে।

প্রথম উদাহরণ (1 প্রত্যাবর্তন):

.L4:
    call    x
    testl   %eax, %eax
    jne .L4
    movl    $0, %eax
    addq    $32, %rsp
    popq    %rbp
    ret
    .seh_endproc
    .ident  "GCC: (tdm64-2) 4.8.1"

দ্বিতীয় উদাহরণ (প্রত্যাবর্তন sqrt(7)):

.L4:
    call    x
    xorpd   %xmm1, %xmm1
    ucomisd %xmm1, %xmm0
    jp  .L4
    xorpd   %xmm1, %xmm1
    ucomisd %xmm1, %xmm0
    jne .L4
    movl    $0, %eax
    addq    $32, %rsp
    popq    %rbp
    ret
    .seh_endproc
    .ident  "GCC: (tdm64-2) 4.8.1"

যাইহোক, -O1উপরে এবং উপরে, তারা উভয়ই পূর্ববর্তী উদাহরণগুলির (একইভাবে jmpপূর্ববর্তী লেবেলের নিঃশর্ত ফিরে) একই সমাবেশ তৈরি করে ।

টি এল; ডিআর

জিসিসির অধীনে বিভিন্ন লুপগুলি অভিন্ন সমাবেশে সংকলিত হয়। সংকলক ধ্রুবক মানগুলি মূল্যায়ন করে এবং প্রকৃত তুলনা সম্পাদনকে বিরক্ত করে না।

গল্পটির নৈতিকতা হ'ল:

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

196
হতে পারে সাক্ষাত্কারকারকটি জিসিসি ব্যবহার করছিল না
এমএম

106
@ ম্যাট ম্যাকনাবব এটি একটি ভাল বিষয়, তবে যদি সাক্ষাত্কারকারক সংকলক-নির্দিষ্ট অপটিমাইজেশনের উপর নির্ভর করে থাকেন তবে তাদের প্রশ্নের মধ্যে তাদের সম্পর্কে খুব স্পষ্ট হওয়া দরকার, এবং সঠিক উত্তর হিসাবে তাদের "কোনও পার্থক্য নেই" উত্তরটি গ্রহণ করতে হবে কিছু (সর্বাধিক?) সংকলক।
জোনাথন হার্টলি

109
কোনও সন্দেহ দূর করার জন্য, আমি এটিকে ঝাঁকুনি 3.4.2 এ পরীক্ষা করেছি এবং উভয় লুপ প্রতিটি -Oস্তরে একই সমাবেশ তৈরি করে ।
মার্টিন টর্নয়েজ

16
লুপগুলির শর্তাধীন বিভাগে আপনি যে সমস্ত কিছু রেখেছেন তা সংকলন-সময় ধ্রুবক হিসাবে আমি এটিকে মোটেই অবাক করে দেখছি না। এরূপ হিসাবে, আমি সন্দেহ করব যে কোনও সংকলক তারা দেখতে পাবে যে তারা লুপগুলি সর্বদা সত্য বা মিথ্যা এবং সংশ্লেষপূর্ণভাবে কেবল jmpশুরুতে ফিরে আসে বা লুপটি পুরোপুরি সরিয়ে দেয়।
sherrellbc

10
@ হিপ্পিট্রেইল আমি দেখতে পাচ্ছি না যে লুপের সামগ্রী (বা এর অভাব) সম্ভবত এই অপ্টিমাইজেশানগুলিকে কীভাবে প্রভাব ফেলতে পারে (কোনও breakবিবৃতি দেওয়ার সম্ভাবনা বাদে ) তবে আমি কেবল এটি যাইহোক এবং না পরীক্ষা করে দেখলাম এমনকি লুপের অভ্যন্তরে কোড সহ উভয় while(1)এবং জন্য নিরঙ্কুশ এবং নিঃশর্ত while(2)। আপনি যদি সত্যিই উদ্বিগ্ন হন তবে অন্যকে নিজেরাই নির্দ্বিধায় পরীক্ষা করুন।
ApproachingDarknessFish

282

হ্যাঁ, while(1)অনেক দ্রুত চেয়ে while(2), জন্য একটি মানবিক পড়তে! যদি আমি while(1)অপরিচিত কোডবেসে দেখতে পাই তবে আমি তাত্ক্ষণিকভাবে জানতে পারি যে লেখকটির উদ্দেশ্য কী, এবং আমার চোখের বলগুলি পরবর্তী লাইনে চালিয়ে যেতে পারে।

যদি আমি দেখি while(2), আমি সম্ভবত আমার ট্র্যাকগুলিতে থামব এবং লেখক কেন লিখলেন না তা বোঝার চেষ্টা করব while(1)। কিবোর্ডে লেখকের আঙুলটি পিছলে গেল? এই কোডবাসের রক্ষণাবেক্ষণকারীরা while(n)লুপগুলি অন্যরকম দেখানোর জন্য কোনও অস্পষ্ট মন্তব্য করার প্রক্রিয়া হিসাবে ব্যবহার করেন? কিছু ভাঙা স্থির বিশ্লেষণ সরঞ্জামে কি জালিয়াতি সতর্কতার জন্য এটি অপরিশোধিত কাজ? বা এটি কি একটি সূত্র যা আমি উত্পন্ন কোডটি পড়ছি? এটি কোনও বাগ-পরামর্শযুক্ত অনুসন্ধান-ও-প্রতিস্থাপন-সমস্ত, বা একটি খারাপ মার্জ, বা মহাজাগতিক রশ্মির ফলাফল? হতে পারে এই লাইন কোডটি নাটকীয়ভাবে আলাদা কিছু করার কথা। সম্ভবত এটি পড়ার কথা ছিল while(w)বা while(x2)। আমি ফাইলের ইতিহাসে লেখককে আরও ভালভাবে খুঁজে পেয়ে তাদের একটি "ডাব্লুটিএফ" ইমেল পাঠাতাম ... এবং এখন আমি আমার মানসিক প্রসঙ্গটি ভেঙেছি।while(2)while(1) এক সেকেন্ডের ভগ্নাংশ নিয়ে যেত!

আমি অতিরঞ্জিত করছি, তবে কেবল কিছুটা কোড পঠনযোগ্যতা সত্যিই গুরুত্বপূর্ণ। এবং এটি একটি সাক্ষাত্কারে উল্লেখযোগ্য!


আমার ধারণাগুলি ঠিক এবং সঠিকভাবে কেন (1) দ্রুততর হ'ল যদিও আমি মনে করি এটি কোনও পরিচালকের নিজেকে বোঝানোর চেষ্টা করা কেবল পুরানো ঘটনা ছিল যে তিনি যখন কোডিংয়ের বিষয়ে জানেন না তখন তিনি সবই দেখেছিলেন, প্রত্যেকেই একটি হতে চায় Jedi।
নির্মাতা

8
অবশ্যই, এটি মোটেও অত্যুক্তি নয়। অবশ্যই svn-annotate বা git blame(বা যাই হোক না কেন) এখানে ব্যবহৃত হবে এবং সাধারণভাবে কোনও ফাইলের দোষ ইতিহাস লোড করতে কয়েক মিনিট সময় লাগে। তারপরে অবশেষে সিদ্ধান্ত নেওয়ার জন্য "আহ আমি বুঝতে পেরেছি, হাইস্কুল থেকে সতেজ হওয়ার পরে লেখক এই লাইনটি লিখেছিলেন", মাত্র 10 মিনিট হেরে গিয়েছিল ...
v.oddou

11
ভোট দিয়েছি কারণ আমি সম্মেলনে অসুস্থ। বিকাশকারীটির নিজের পছন্দ মতো একটি সংখ্যা লেখার এই শাস্তি সুযোগ রয়েছে, তারপরে বিরক্তিকর কেউ এসে কেন তা হয় তা নিয়ে তাড়িত হন 1
থোঅ্যাপেলসিন

1
অলঙ্কৃতের কারণে অবনমিত। (1) পড়ার সময় যেমন হ'ল ঠিক তেমন গতি (2)।
hdante

4
আমি এক মিনিট আগে এই উত্তরটিতে বর্ণিত ঠিক একই মানসিক প্রক্রিয়াটি পেরিয়েছিলাম যখন আমি কোডটিতে দেখেছি while(2)(নীচে "এই কোডবেসটির রক্ষণাবেক্ষণকারীরা লুপগুলি আলাদা দেখানোর জন্য একটি অস্পষ্ট মন্তব্য করার পদ্ধতি হিসাবে ব্যবহার করছেন)?" )। তো না, আপনি অত্যুক্তি করছেন না!
হিশাম এইচএম

151

নির্দিষ্ট সংকলনের সাথে একটি নির্দিষ্ট টার্গেটের জন্য নির্দিষ্ট সংকলকের দ্বারা উত্পন্ন কোডটি দেখানো বিদ্যমান উত্তরগুলি প্রশ্নের সম্পূর্ণরূপে উত্তর দেয় না - যদি না সেই নির্দিষ্ট প্রসঙ্গে প্রশ্নটি না জিজ্ঞাসা করা হয় ("x86_64 এর জন্য জিসিসি ৪.7.২ ব্যবহার করা কোনটি দ্রুত হয়) ডিফল্ট বিকল্পগুলির সাথে? ", উদাহরণস্বরূপ)।

যতদূর ভাষা সংজ্ঞা উদ্বিগ্ন হয়, মধ্যে বিমূর্ত মেশিন while (1) পূর্ণসংখ্যা ধ্রুবক মূল্যায়ণ 1এবং while (2)পূর্ণসংখ্যা ধ্রুবক মূল্যায়ণ 2; উভয় ক্ষেত্রেই ফলাফলটির সমতা শূন্যের সাথে তুলনা করা হয়। ভাষার মান দুটি নির্মাণের আপেক্ষিক কর্মক্ষমতা সম্পর্কে একেবারে কিছুই বলে না।

আমি কল্পনা করতে পারি যে একটি অত্যন্ত নিখুঁত সংকলক দুটি রূপের জন্য আলাদা আলাদা মেশিন কোড তৈরি করতে পারে, কমপক্ষে অপ্টিমাইজেশনের অনুরোধ ছাড়াই সংকলিত অবস্থায়।

অন্যদিকে, সি সংকলকগণ অবশ্যই সংকলন সময়ে কিছু ধ্রুবক অভিব্যক্তিগুলির মূল্যায়ন করতে হবে , যখন এগুলি প্রসঙ্গে উপস্থিত হয় যেখানে ধ্রুবক অভিব্যক্তি প্রয়োজন। উদাহরণস্বরূপ, এটি:

int n = 4;
switch (n) {
    case 2+2: break;
    case 4:   break;
}

একটি ডায়াগনস্টিক প্রয়োজন; একটি অলস সংকলক 2+2কার্যকর করার সময় পর্যন্ত মূল্যায়ন স্থগিত করার বিকল্প নেই । যেহেতু একটি সংকলক সংকলন সময়ে ধ্রুবক প্রকাশ মূল্যায়ন করার ক্ষমতা থাকতে হবে, এটি প্রয়োজন না হলেও এমনকি এই ক্ষমতাটির সুযোগ না নেওয়ার কোনও ভাল কারণ নেই।

সি স্ট্যান্ডার্ড ( N1570 6.8.5p4) এটি বলে

একটি পুনরাবৃত্তি বিবৃতি লুপ বডি নামে একটি বিবৃতি বারবার কার্যকর করা হয় যতক্ষণ না নিয়ন্ত্রক এক্সপ্রেশন 0 এর সমান তুলনা করে।

সুতরাং প্রাসঙ্গিক ধ্রুবক এক্সপ্রেশন 1 == 0এবং 2 == 0উভয়ই intমূল্যকে মূল্যায়ন করে 0। (এই তুলনাটি whileলুপের শব্দার্থবিজ্ঞানের অন্তর্নিহিত ; এগুলি প্রকৃত সি এক্সপ্রেশন হিসাবে উপস্থিত নেই))

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

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

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

নীচের লাইন: while (1)এবং while(2) প্রায় একই কর্মক্ষমতা আছে। তাদের ঠিক একই শব্দার্থক শব্দ রয়েছে এবং কোনও সংকলক অভিন্ন কোড উত্পন্ন না করার কোনও ভাল কারণ নেই।

যদিও এটি while(1)তুলনায় সম্পূর্ণরূপে while(2)কোনও সংকলকটির জন্য দ্রুত কোড উত্পন্ন করার জন্য আইনী , একই প্রোগ্রামে while(1)অন্য ঘটনার চেয়ে কমপাইলারের পক্ষে দ্রুত কোড উত্পন্ন করা সমান বৈধ while(1)

(আপনি যা জিজ্ঞাসা করেছেন তার মধ্যে আরও একটি প্রশ্ন অন্তর্ভুক্ত রয়েছে: আপনি কোনও ইন্টারভিউয়ারের সাথে কীভাবে আচরণ করবেন যে কোনও ভুল প্রযুক্তিগত পয়েন্টের জন্য জোর দেয় Work সম্ভবত ওয়ার্কপ্লেস সাইটের পক্ষে এটি একটি ভাল প্রশ্ন হবে ))।


8
"এই ক্ষেত্রে, প্রাসঙ্গিক (অন্তর্নিহিত) ধ্রুবক এক্সপ্রেশনগুলি 1! = 0 এবং 2! = 0, উভয়ই ইনট মান 1 এর মূল্যায়ন করে" ... এটি অত্যধিক জটিল, এবং ভুল। স্ট্যান্ডার্ডটি কেবল বলেছে যে কন্ট্রোলিং এক্সপ্রেশনটি whileঅবশ্যই স্কেলার প্রকারের হতে হবে এবং লুপ বডিটি পুনরায় পুনরুক্ত করা হয় যতক্ষণ না এক্সপ্রেশনটি 0 এর সমান হয় তবে এটি বলে না যে একটি নিদর্শন রয়েছে expr != 0যা মূল্যায়ন করা হয় ... যার ফলাফলের প্রয়োজন হবে যে - 0 বা 1 - পরিবর্তে 0 এর সাথে তুলনা করুন, বিজ্ঞাপনের সাথে। না, অভিব্যক্তিটি 0 এর সাথে তুলনা করা হয়েছে, তবে সেই তুলনাটি কোনও মান দেয় না। পিএস আমি upvated।
জিম বাল্টার

3
@ জিমবাল্টার: আমি আপনার বক্তব্যটি দেখছি, এবং আমি আমার উত্তরটি এটি আপডেট করার জন্য আপডেট করব। যদিও আমি বোঝাতে চেয়েছিলাম, এটি ছিল স্ট্যান্ডার্ডের শব্দটি "... যতক্ষণ না নিয়ন্ত্রক অভিব্যক্তি 0 এর সমান তুলনা করে" মূল্যায়ন বোঝায় <expr> == 0; সি এর সাথে "0 এর সমান তুলনা করা" এর অর্থ এটিই whileলুপের শব্দার্থবিদ্যার অংশ । মান বা আমার উত্তরে কোনও জড়িত নেই, ফলাফলটির সাথে 0আবার তুলনা করা দরকার । (এর ==পরিবর্তে আমার লেখা উচিত ছিল !=)) তবে আমার উত্তরের সেই অংশটি অস্পষ্ট ছিল, এবং আমি এটি আপডেট করব।
কিথ থম্পসন

1
"" "এর সাথে তুলনা করে" "সি" এর অর্থ - তবে সেই ভাষাটি স্ট্যান্ডার্ডে রয়েছে , সি তে নয় ... বাস্তবায়ন তুলনা করে, এটি সি ভাষার তুলনা তৈরি করে না। আপনি "উভয়ই int মান 1 এর মূল্যায়ন করেন" লিখেছেন - তবে এর আগে কখনও এরকম মূল্যায়ন হয় না। তোমার জন্য কোডটি তাকান while (2), while (pointer), while (9.67), সবচেয়ে সাদাসিধা, unoptimized কম্পাইলার দ্বারা, তাই না যে উৎপাদনের উত্পন্ন কোন কোড দেখতে পাবেন 0বা 1। "আমার উচিত == এর চেয়ে == লেখা উচিত" - না, এটি কোনও অর্থবোধ করে না।
জিম বাল্টার

2
@ জিমবাল্টার: হুমম্ম। আমি বলতে চাইছি না যে "0 এর সাথে সমান তুলনা করা" ... == 0সি অভিব্যক্তির অস্তিত্বকে বোঝায় । আমার বক্তব্যটি হ'ল whileলুপগুলির স্ট্যান্ডার্ডের বিবরণ এবং একটি স্পষ্ট x == 0অভিব্যক্তি যৌক্তিকভাবে একই ক্রিয়াকে বোঝায় উভয় "0 এর সমান তুলনা করুন" । এবং আমি মনে করি যে একটি বেদনাদায়ক নিখুঁত সি সংকলক কোড উত্পন্ন করতে পারে যা কোনও লুপের intমান 0বা জেনারেট তৈরি করে - যদিও আমি বিশ্বাস করি না যে কোনও প্রকৃত সংকলক যথেষ্টই নিষ্পাপ is 1while
কিথ থম্পসন

12
দ্রষ্টব্য: এটি ইতিমধ্যে কর্মক্ষেত্রের একটি প্রশ্ন: ওয়ার্কপ্লেস.স্ট্যাকেক্সচেঞ্জ / প্রশ্নগুলি / 43৪৪৪/২
জো

141

একটি মিনিট অপেক্ষা করুন. সাক্ষাত্কারকারক, সে কি এই লোকটির মতো দেখাচ্ছে?

এখানে চিত্র বর্ণনা লিখুন

এটি যথেষ্ট খারাপ যে ইন্টারভিউয়ার নিজেই এই সাক্ষাত্কারটিতে ব্যর্থ হয়েছে , যদি এই সংস্থার অন্যান্য প্রোগ্রামাররা এই পরীক্ষাটি "পাস" করে তবে কী হবে?

নং বিবৃতি মূল্যায়ন 1 == 0এবং সমান দ্রুত 2 == 0 হওয়া উচিত । আমরা দুর্বল সংকলক বাস্তবায়নগুলি কল্পনা করতে পারি যেখানে অন্যের চেয়ে দ্রুত হতে পারে be তবে একজনের অপরটির চেয়ে দ্রুত হওয়া উচিত এমন কোনও ভাল কারণ নেই ।

যদিও দাবিটি সত্য হবে তখন কিছু অস্পষ্ট পরিস্থিতি থাকলেও প্রোগ্রামারদের অস্পষ্ট জ্ঞানের উপর ভিত্তি করে মূল্যায়ন করা উচিত নয় (এবং এই ক্ষেত্রে ভঙ্গুর) ট্রিভিয়া। এই সাক্ষাত্কারটি সম্পর্কে চিন্তা করবেন না, এখান থেকে সেরা পদক্ষেপটি চলে যাওয়া।

দাবি অস্বীকার : এটি কোনও আসল দিলবার্ট কার্টুন নয়। এটি নিছক একটি ম্যাসআপ


6
এই মজার হবে, যদি এটা ছিল এছাড়াও প্রশ্নের উত্তর ধারণ করে।
কোডি গ্রে

না তবে সত্যই, আমরা সকলেই মোটামুটি সহজেই কল্পনা করতে পারি যে গুরুতর সংস্থাগুলি দ্বারা লিখিত সমস্ত সংকলক যুক্তিসঙ্গত কোড তৈরি করবে। আসুন "নন অপটিমাইজড কেস" / ও 0 নেওয়া যাক, সম্ভবত এটিনাটোলিগ পোস্টের মতো শেষ হবে। তারপরে এটি cmpসিপিইউয়ের একটি প্রশ্ন, অপারেন্ডটি কি কম চক্রের সাথে 2 থেকে 0 এর তুলনায় 1 থেকে 0 তুলনা করবে? সাধারণত সিএমপি কার্যকর করতে কত চক্র লাগে? বিট নিদর্শন অনুযায়ী এটি পরিবর্তনশীল? তারা কি আরও "জটিল" বিট নিদর্শনগুলি ধীর করে দেয় cmp? আমি ব্যক্তিগতভাবে জানি না। আপনি 0 থেকে n র‌্যাঙ্ক (উদাহরণস্বরূপ এন = 31) থেকে কিছুটা ধাপে একটি সুপার ইডিয়টিক বাস্তবায়ন পরীক্ষা করতে পারবেন।
v.oddou

5
এটি আমার cmpবক্তব্যও : অপারেন্ডটি 1 এবং 200 এর জন্য সমান দ্রুত হওয়া উচিত Pro সম্ভবত আমরা বুদ্ধিমান বাস্তবায়নগুলি কল্পনা করতে পারি যেখানে এটি হয় না। তবে আমরা কী কোনও অ-মূর্খ বাস্তবায়ন কল্পনা করতে পারি যে এর while(1)চেয়ে দ্রুত কোথায় while(200)? একইভাবে, যদি কিছু প্রাক-ageতিহাসিক যুগে একমাত্র উপলভ্য বাস্তবায়ন সেইরকম বুদ্ধিমান ছিল, তবে আজকে কি আমাদের এ নিয়ে ঝগড়া করা উচিত? আমার মনে হয় না, এটি মুখ্য কেশিক বসের আলাপ, এবং এটিতে একটি বাস্তব রত্ন!
জানুস

@ v.ouddou "2 থেকে 0 এর তুলনায় 1 থেকে 0" তুলনা করে কম চক্রের মধ্যে সিএমপি অপারেন্ড চলবে - না a আপনার চক্রটি কী তা শিখতে হবে। "আমি ব্যক্তিগতভাবে জানি না। আপনি কল্পনা করতে পারেন একটি সুপার ইডিয়টিক বাস্তবায়ন কিছুটা হলেও পর্যায়ক্রমে 0 থেকে n" - বা অন্যভাবে, এখনও সাক্ষাত্কারকে একটি নিখুঁত বোকা বানিয়েছেন। এবং কেন পর্যায়ক্রমে পর্যায়ক্রমে চেক সম্পর্কে চিন্তা? বাস্তবায়নটি এমন একটি বাক্সের একজন ব্যক্তি হতে পারে যিনি আপনার প্রোগ্রামটি মূল্যায়নের মাঝখানে মধ্যাহ্নভোজনের বিরতি নেওয়ার সিদ্ধান্ত নেন।
জিম বাল্টার

79

আপনার ব্যাখ্যা সঠিক। এটি এমন একটি প্রশ্ন বলে মনে হচ্ছে যা প্রযুক্তিগত জ্ঞানের পাশাপাশি আপনার আত্মবিশ্বাসের পরীক্ষা করে।

যাইহোক, যদি আপনি উত্তর

কোডের উভয় অংশই সমান দ্রুত, কারণ উভয়ই সম্পূর্ণ করতে অসীম সময় নেয়

সাক্ষাত্কার বলতে হবে

তবে while (1)প্রতি সেকেন্ডে আরও পুনরাবৃত্তি করতে পারে; আপনি ব্যাখ্যা করতে পারেন কেন? (এটি আজেবাজে কথা; আবার আপনার আত্মবিশ্বাসের পরীক্ষা করা)

সুতরাং আপনার মতো জবাব দিয়ে আপনি কিছুটা সময় সাশ্রয় করেছেন যা আপনি অন্যথায় এই খারাপ প্রশ্নটি নিয়ে আলোচনা করতে নষ্ট করবেন।


আমার সিস্টেমে সংকলক দ্বারা উত্পাদিত একটি উদাহরণ কোড এখানে রয়েছে (এমএস ভিজ্যুয়াল স্টুডিও 2012), অপ্টিমাইজেশন বন্ধ রয়েছে:

yyy:
    xor eax, eax
    cmp eax, 1     (or 2, depending on your code)
    je xxx
    jmp yyy
xxx:
    ...

অপ্টিমাইজেশন চালু রয়েছে:

xxx:
    jmp xxx

সুতরাং উত্পন্ন কোডটি হুবহু হ'ল কমপক্ষে একটি অনুকূলিতকরণ সংকলক সহ।


28
এই কোডটি সত্যই আমার সিস্টেমে সংকলক আউটপুট দেয়। আমি এটি আপ করা হয়নি।
অ্যানাটলিগ

10
আইসপ্যাক "কিছুক্ষণের জন্য অপারেন্ড বুলিয়ান ধরণের" - একদম বাজে কথা। আপনি কি সাক্ষাত্কার? আমি আপনাকে পরামর্শ দিচ্ছি যে এই জাতীয় দাবি করার আগে আপনি সি ভাষা এবং এর মানের সাথে পরিচিত হন।
জিম বাল্টার

29
"আমি এটি তৈরি করিনি"। - দয়া করে আইসপ্যাকের দিকে মনোযোগ দিন না, যিনি বাজে কথা বলছেন। সি এর কোনও বুলিয়ান টাইপ নেই (এটি স্টাডবুল এইচ _-তে রয়েছে তবে এটি একই নয়, এবং এর whileদীর্ঘকালীন শব্দার্থবিজ্ঞান ) এবং অপারেন্ডটি whileবুলিয়ান বা _বুল বা অন্য কোনও নির্দিষ্ট ধরণের নয়। অপারেন্ডটি কোনও অভিব্যক্তি whileহতে পারে ... সময়টি 0 এ বিরতি দেয় এবং অ 0-এ অব্যাহত থাকে।
জিম বাল্টার

36
"কোডের দুটি অংশই সমান দ্রুত, কারণ উভয়ই সম্পূর্ণ করতে অসীম সময় নেয়" আমাকে আকর্ষণীয় কিছু ভাবতে বাধ্য করে। অসীম লুপটি শেষ করার একমাত্র উপায় হ'ল চার্জযুক্ত কণা বা হার্ডওয়্যার ব্যর্থ হওয়া দ্বারা কিছুটা উল্টানো হবে: বিবৃতিটি থেকে পরিবর্তন while (00000001) {}করা while (00000000) {}। যত বেশি সত্য বিট আপনার কাছে ভ্যালুতে ফ্লিপ হওয়ার সম্ভাবনা কম থাকে। দুঃখের বিষয়, 2 এরও একটি সত্য বিট রয়েছে। 3 তবে উল্লেখযোগ্যভাবে দীর্ঘস্থায়ী হবে। এটি কেবলমাত্র একটি সংকলকের ক্ষেত্রেও প্রযোজ্য যা সর্বদা এটি অপসারণ করে না (ভিসি ++)।
জোনাথন ডিকিনসন

8
@ এমআর 5 নোপ কিছুটা উল্টানোর জন্য বাস্তবে এরকম কিছু ঘটতে পারে আপনি কয়েক হাজার বছর ধরে মৃত্যুদন্ড কার্যকর করার সময়টির বিষয়ে কথা বলছেন। কেবল একটি চিন্তার পরীক্ষা। আপনি যদি কোনও অমর জাতি থেকে থাকেন তবে আপনার প্রোগ্রামকে বিট-ফ্লিপিং প্রতিরোধ করতে আপনি -1 ব্যবহার করতে পারেন।
জোনাথন ডিকিনসন

60

প্রশ্নের সম্ভবত সম্ভাব্য ব্যাখ্যা হ'ল সাক্ষাত্কারকারক মনে করেন যে প্রসেসর একটি পৃথক সংখ্যার পৃথক বিটগুলি পরীক্ষা করে দেখবে যতক্ষণ না এটি একটি শূন্য-মানকে আঘাত করে:

1 = 00000001
2 = 00000010

যদি "শূন্য হয়?" অ্যালগোরিদম সংখ্যার ডান দিক থেকে শুরু হয় এবং প্রতিটি বিট চেক করতে হবে যতক্ষণ না এটি শূন্য-বিট এ পৌঁছায়, while(1) { }লুপটি পুনরুক্তি হিসাবে দ্বিগুণ বিট দ্বিগুণ করতে হবে while(2) { }

এটি কম্পিউটারগুলি কীভাবে কাজ করে তার একটি খুব ভুল মানসিক মডেল প্রয়োজন তবে এটির নিজস্ব অভ্যন্তরীণ যুক্তি রয়েছে। যাচাই করুন ওয়ান ওয়ে যদি জিজ্ঞাসা করতে হবে while(-1) { }বা while(3) { }সমান ফাস্ট হবে, অথবা যদি while(32) { }হবে এমনকি ধীর


39
আমি ধরে নিয়েছি যে সাক্ষাত্কারটির ভুল ধারণাটি আরও 2 "এর মতো একটি শর্তসাপেক্ষে প্রকাশের জন্য বুলিয়ান রূপান্তরিত হওয়া দরকার, যেখানে 1 ইতিমধ্যে বুলিয়ান।"
রাসেল বোরোগোভ

7
এবং যদি তুলনা অ্যালগরিদম বাম থেকে শুরু হয়, তবে এটি অন্যভাবে।
পেলো ইবারম্যান

1
+1, এটাই আমি ভেবেছিলাম। আপনি এমন কাউকে মৌলিকভাবে বিশ্বাস করে নিখুঁতভাবে কল্পনা করতে পারেন, cmpসিপিইউয়ের অ্যালগরিদম প্রথম তফাতটিতে প্রারম্ভিক লুপ প্রস্থান সহ একটি লিনিয়ার বিট চেক।
v.oddou

1
@ পিটারকর্ডস "আমি কখনই কাউকে শুনিনি (আপনি ব্যতীত) তর্ক করেছেন যে জিসিসি বা ক্ল্যাংয়ের -O0আউটপুট যথেষ্ট আক্ষরিক নয়।" আমি কখনই এ জাতীয় কথা বলি নি এবং আমার মনে কোনও জিসিসি বা ঝাঁকুনি ছিল না। তুমি নিশ্চয়ই আমাকে ভুল করে ফেলছ আমি কেবল আপনার মতামত নই যে এমএসভিসি যা উত্পাদন করে তা হাস্যকর।
blubberdiblub

1
@ পিটারকর্ডস আমি ভুল ছিলাম, এমএসভিসিতে while(1)লুপের আগে ব্রেক ব্রেকপয়েন্টটি ভেঙে যায় না, তবে অভিব্যক্তিতে। এক্সপ্রেশন দূরে অপ্টিমাইজ করার সময় এটি লুপের ভিতরে পড়ে যায়। প্রচুর বিরতি সহ এই কোডটি নিন । Unoptimized ডিবাগিং মোডে আপনি পেতে এই । অপ্টিমাইজ করার সময়, অনেক ব্রেকপয়েন্টগুলি একসাথে পড়ে যায় বা এমনকি পরবর্তী কার্যক্রমে ছড়িয়ে পড়ে (আইডিই ডিবাগ করার সময় ফলাফল ব্রেকপয়েন্টগুলি দেখায়) - সম্পর্কিত বিযুক্তি
blubberdiblub

32

অবশ্যই আমি এই ম্যানেজারের আসল উদ্দেশ্যগুলি জানি না, তবে আমি সম্পূর্ণ ভিন্ন দৃষ্টিভঙ্গির প্রস্তাব দিই: একটি নতুন সদস্যকে একটি দলে নিয়োগের সময়, তিনি বিরোধী পরিস্থিতিতে কীভাবে প্রতিক্রিয়া দেখান তা কার্যকর হবে।

তারা আপনাকে দ্বন্দ্বের দিকে ঠেলে দিয়েছে। যদি এটি সত্য হয় তবে তারা চালাক এবং প্রশ্নটি ভাল ছিল। কিছু শিল্প যেমন, ব্যাংকিংয়ের মতো আপনার সমস্যার স্ট্যাক ওভারফ্লোতে পোস্ট করা প্রত্যাখ্যানের কারণ হতে পারে।

তবে অবশ্যই আমি জানি না, আমি কেবল একটি বিকল্প প্রস্তাব করছি।


এটি প্রকৃতপক্ষে দুর্দান্ত তবে (২) বনাম (১) অবশ্যই ডিলবার্ট কমিকস থেকে নেওয়া হয়েছে। এটি তার সঠিক মনের মধ্যে কারও দ্বারা উদ্ভাবিত হতে পারে না (যেভাবে কীভাবে কেউ লিখতে পারে (2) যাইহোক লেখার সম্ভাব্য জিনিস হিসাবে?)। যদি আপনার অনুমানটি সত্য হয় তবে অবশ্যই আপনি একটি সমস্যা এতটা অনন্য দান করবেন যে আপনি এটির জন্য গুগল করতে পারেন। "(1xf00b442)" (1) "এর চেয়ে ধীর গতির মতো" কীভাবে ব্যাংক অন্যভাবে ইনারভিউয়ের প্রশ্নটি খুঁজে পাবে? আপনি কি মনে করেন যে তারা এনএসএ এবং কীস্কোরটিতে অ্যাক্সেস পেয়েছে?
v.oddou

25

আমি মনে করি যে ক্লুটি "একজন সিনিয়র ম্যানেজারের জিজ্ঞাসিত" তে পাওয়া উচিত। এই ব্যক্তি স্পষ্টতই যখন তিনি পরিচালক হন প্রোগ্রামিং বন্ধ করে দিয়েছিলেন এবং তারপরে সিনিয়র ম্যানেজার হতে কয়েক বছর সময় লেগেছিল। প্রোগ্রামিংয়ে কখনও আগ্রহ হারিয়ে ফেলেনি, তবে সেদিনের পরে কখনও কোনও লাইনও লিখেনি। সুতরাং তার উল্লেখটি "কোনও শালীন সংকলক সেখানে নেই" যেমন কিছু উত্তরের উল্লেখ রয়েছে, তবে "এই ব্যক্তিটি 20-30 বছর আগে এই সংকলকটির সাথে কাজ করেছিলেন"।

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

আপনাকে নিয়োগ দেওয়ার জন্য সর্বোত্তম পন্থা সম্ভবত এমন একটি যা সিনিয়র ম্যানেজারকে দূরে সরিয়ে নিতে সক্ষম করে এবং আপনি " সাক্ষাত্কারের ভাল পুরানো দিনগুলি" সম্পর্কে 2-3 মিনিটের সময় বক্তৃতা দেওয়ার আগে আপনি তাকে পরবর্তী সাক্ষাত্কারের বিষয়ে সাবলীলভাবে নেতৃত্ব দেওয়ার আগে । (এখানে ভাল সময় নির্ধারণ করা গুরুত্বপূর্ণ - খুব দ্রুত এবং আপনি গল্পটি ব্যাহত করছেন - খুব ধীর এবং আপনার পর্যাপ্ত ফোকাস নেই এমন লেবেলযুক্ত)। সাক্ষাত্কার শেষে তাকে বলুন যে আপনি এই বিষয়টি সম্পর্কে আরও জানতে আগ্রহী হবেন।


19

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


14
@ জি কেএফএক্স আপনি যদি উত্তরটি দিয়ে থাকেন এবং তারা আপনাকে জানায় যে আপনি ভুল, আপনি কেন এটি ব্যাখ্যা করতে বলবেন না এমন কোনও কারণ নেই। যদি আনাতোলিগটি সঠিক হয় এবং এটি আপনার আত্মবিশ্বাসের একটি পরীক্ষা হয় তবে আপনার ব্যাখ্যা করা উচিত যে আপনি কেন যেভাবে উত্তর দিয়েছিলেন এবং কেন তাদের অনুরোধ করেছিলেন।
P.Turpie

আমি আপনাকে তাদের প্রথম কথা বলেছিলাম। এটি "এক্স দ্রুত কেন হয়?" "আমি জানি না; এক্স দ্রুত কেন?" স্পষ্টতই, সঠিকভাবে উত্তর দেওয়ার পরে আপনি জিজ্ঞাসা করতে পারেন।
GKFX

18

এই প্রশ্নের খাতিরে, আমার যুক্ত করা উচিত আমি সি কমিটি থেকে লিখেছি যে ডগ গুইন লিখেছিলেন যে অপ্টিমাইজার পাস ছাড়াই কিছু প্রারম্ভিক সি সংকলক while(1)( for(;;)যা এর সাথে তুলনা করে) এর জন্য অ্যাসেমব্লিতে একটি পরীক্ষা তৈরি করে।

আমি এই historicalতিহাসিক নোটটি দিয়ে সাক্ষাত্কারকারীর জবাব দেব এবং তারপরে বলব যে আমি যে কোনও সংকলক এটি করায় খুব অবাক হলেও, একটি সংকলকও এটি করতে পারে:

  • অপটিমাইজার ছাড়া পাস কম্পাইলার উভয়ের জন্য একটি পরীক্ষা উৎপন্ন while(1)এবংwhile(2)
  • অপ্টিমাইজার পাস দিয়ে সংকলককে (নিঃশর্ত জাম্প সহ) সর্বোত্তম করার জন্য নির্দেশ দেওয়া হয়েছে while(1)কারণ এগুলি অহংকারী হিসাবে বিবেচিত হয়। এটি while(2)পরীক্ষার সাথে ছেড়ে দেবে এবং তাই উভয়ের মধ্যে পারফরম্যান্সের পার্থক্য তৈরি করে।

আমি অবশ্যই সাক্ষাত্কারকারীর সাথে যুক্ত করব যে বিবেচনা না করা while(1)এবং while(2)একই নির্মাণটি নিম্নমানের অপ্টিমাইজেশানের লক্ষণ কারণ এটি সমতুল্য নির্মাণ।


10

এই জাতীয় প্রশ্নটি আর একবার করা আপনার ম্যানেজারকে বলার মতো সাহস পেয়েছিল কিনা তা দেখা উচিত যে সে / সে ভুল! এবং আপনি কীভাবে আলতো করে তা যোগাযোগ করতে পারেন।

আমার প্রথম প্রবৃত্তিটি ম্যানেজারকে দেখানোর জন্য এসেম্বলির আউটপুট উত্পন্ন করা হত যে কোনও শালীন সংকলককে এটির যত্ন নেওয়া উচিত এবং এটি যদি এটি না করে তবে আপনি তার জন্য পরবর্তী প্যাচ জমা দেবেন :)


8

এত লোককে এই সমস্যায় ডুবানো দেখতে, আপনি কীভাবে মাইক্রো-অপ্টিমাইজ করতে চান তা দেখার জন্য এটি কেন খুব ভাল একটি পরীক্ষা হতে পারে তা দেখায় ।

আমার উত্তর হবে; এটি এতটা গুরুত্বপূর্ণ নয়, আমি বরং আমরা যে ব্যবসায়িক সমস্যার সমাধান করছি তার দিকে মনোনিবেশ করি। সর্বোপরি, আমি এর জন্য অর্থ প্রদান করতে যাচ্ছি।

তদুপরি, আমি বিকল্পটি বেছে নেব while(1) {}কারণ এটি বেশি সাধারণ, এবং অন্য সতীর্থদের কেন 1 এর চেয়ে বেশি সংখ্যক কেন যেতে হবে তা নির্ধারণের জন্য সময় ব্যয় করার প্রয়োজন হবে না।

এখন কিছু কোড লিখুন। ;-)


1
যদি না এমন কিছু রিয়েল-টাইম কোড অপ্টিমাইজ করার জন্য অর্থ প্রদান করা হয় যার জন্য আপনার চলমান সময়ের চাহিদা অনুসারে আপনাকে কেবল 1 বা 2 মিলিসেকেন্ড শেভ করতে হবে। অবশ্যই এটি অপটিমাইজারের জন্য একটি কাজ, কেউ কেউ বলবে - এটি যদি আপনার আর্কিটেকচারের জন্য অপ্টিমাইজার থাকে।
নিওয়েজার্ড

6

আপনি যদি অপ্টিমাইজেশন সম্পর্কে উদ্বিগ্ন হন তবে আপনার ব্যবহার করা উচিত

for (;;)

কারণ এর কোন পরীক্ষা নেই। (ছদ্মবেশী মোড)


2
এজন্য এটি ব্যবহার করা বুদ্ধিমান while(2), এটি অপ্টিমাইজেশনের জন্য জায়গা ছেড়ে দেয়, তারপরে আপনি কেবল স্যুইচ করুনfor (;;) যখন পারফরম্যান্স বৃদ্ধির জন্য প্রস্তুত ।
গ্রো

5

আমার কাছে মনে হয় এটি প্রযুক্তিগত প্রশ্ন হিসাবে মুখোশযুক্ত এমন আচরণগত সাক্ষাত্কারের একটি questions কিছু সংস্থাগুলি এটি করে - তারা কোনও প্রযুক্তিগত প্রশ্ন জিজ্ঞাসা করবে যা কোনও উপযুক্ত প্রোগ্রামারকে উত্তর দেওয়া মোটামুটি সহজ হওয়া উচিত, তবে যখন ইন্টারভিউওয়াই সঠিক উত্তর দেয়, সাক্ষাত্কারকারী তাদের বলবে যে তারা ভুল are

এই পরিস্থিতিতে আপনি কীভাবে প্রতিক্রিয়া করবেন তা সংস্থাটি দেখতে চায়। আত্মবিশ্বাস বা ইন্টারভিউয়ারকে বিরক্ত করার ভয়ের কারণে আপনি কি সেখানে চুপচাপ বসে আছেন এবং আপনার উত্তরটি সঠিক বলে চাপ দিচ্ছেন না? অথবা আপনি কর্তৃত্বের কোনও ব্যক্তিকে চ্যালেঞ্জ জানাতে ইচ্ছুক যাকে আপনি জানেন ভুল? তারা দেখতে চায় যে আপনি নিজের দৃic়বিশ্বাসের পক্ষে দাঁড়াতে ইচ্ছুক কিনা এবং আপনি যদি তা দক্ষ ও সম্মানজনকভাবে করতে পারেন তবে।


3

আমি সি এবং অ্যাসেম্বলি কোডটি আবার প্রোগ্রাম করতাম যখন এই ধরণের বাজে কথাটি কোনও পার্থক্য করতে পারে। যখন এটি কোনও পার্থক্য করেছিল তখন আমরা এটি সমাবেশে লিখেছিলাম।

যদি আমাকে সেই প্রশ্ন জিজ্ঞাসা করা হত তবে আমি ডোনাল্ড নুথের অকালীন অপটিমাইজেশন সম্পর্কে বিখ্যাত 1974 সালের উক্তিটি পুনরাবৃত্তি করতাম এবং যদি সাক্ষাত্কার গ্রহণ না করে হাসি না দিয়ে হাঁটত।


1
প্রদত্ত তিনি আরও বলেছিলেন যে "প্রতিষ্ঠিত ইঞ্জিনিয়ারিং শাখায় 12% উন্নতি হয়, সহজেই প্রাপ্তি হয়, তা কখনই প্রান্তিক বলে বিবেচিত হয় না এবং আমি বিশ্বাস করি যে সফটওয়্যার ইঞ্জিনিয়ারিংয়ে একই দৃষ্টিভঙ্গিটি প্রাধান্য পাবে", আমি মনে করি যে আপনি হাঁটাচলা অনুচিত।
এলিস

3

হতে পারে যে সাক্ষাত্কারকারী এই ধরনের বোবা প্রশ্নটি ইচ্ছাকৃতভাবে উত্থাপন করেছিল এবং চেয়েছিল যে আপনি তিনটি পয়েন্ট করুন:

  1. প্রাথমিক যুক্তিদুটি লুপই অসীম, পারফরম্যান্স সম্পর্কে কথা বলা শক্ত।
  2. অপ্টিমাইজেশন স্তর সম্পর্কে জ্ঞান। তিনি আপনার কাছ থেকে শুনতে চেয়েছিলেন যদি আপনি কম্পাইলারটি আপনার জন্য কোনও অপ্টিমাইজেশন করতে দেয় তবে এটি শর্তটিকে অনুকূল করে তুলবে, বিশেষত যদি ব্লকটি খালি না ছিল।
  3. মাইক্রোপ্রসেসর আর্কিটেকচার সম্পর্কে জ্ঞান। বেশিরভাগ আর্কিটেকচারের সাথে 0 এর তুলনা করার জন্য একটি বিশেষ সিপিইউ নির্দেশনা রয়েছে (যদিও দ্রুত প্রয়োজন হয় না)।

2

এখানে একটি সমস্যা: আপনি যদি কোনও প্রোগ্রাম লিখেন এবং এর গতিটি পরিমাপ করেন তবে উভয় লুপের গতি আলাদা হতে পারে! কিছু যুক্তিসঙ্গত তুলনার জন্য:

unsigned long i = 0;
while (1) { if (++i == 1000000000) break; }

unsigned long i = 0;
while (2) { if (++i == 1000000000) break; }

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

সবচেয়ে খারাপ পরিস্থিতি: একটি অনুকূলকরণের সংকলকটি লুপটি কী করে তা নির্ধারণ করে না, তবে দ্বিতীয় লুপটি কার্যকর করা হলে যে মানগুলি তৈরি করা হয় প্রথমগুলির দ্বারা উত্পাদিত একই মানগুলি নির্ধারণ করে। এবং প্রথম লুপের জন্য পুরো কোড তৈরি করুন, তবে দ্বিতীয়টির জন্য নয়।


1
"ক্যাশে লাইনগুলি" যুক্তি কেবল একটি চিপে কাজ করবে যা খুব ছোট ক্যাশে রয়েছে।
ধারালো

10
এটি পয়েন্ট পাশে। গতি সম্পর্কে প্রশ্নগুলি "অন্য সব সমান" ধরে নেওয়া হয়।
জিম বাল্টার

6
@ জিমবাল্টার: এটি গতির প্রশ্ন নয়, এটি একটি সাক্ষাত্কারকারীর সাথে তর্ক সম্পর্কিত একটি প্রশ্ন ছিল। এবং সম্ভাবনা যে সত্যিকারের পরীক্ষা করা সাক্ষাতকারকে "সঠিক" প্রমাণ করতে পারে - কারণগুলির জন্য যার সাথে তার যুক্তির কোনও সম্পর্ক নেই তবে এটি খাঁটি কাকতালীয় ঘটনা। যদি আপনি ভুল প্রমাণ করার চেষ্টা করেন তবে যা আপনাকে বিব্রতকর পরিস্থিতিতে ফেলবে।
gnasher729

1
@ gnasher729 সমস্ত যৌক্তিক যুক্তি একদিকে রেখে, আপনি যে কাকতালীয় বিষয়টির কথা বলছেন তা দেখার মতো হবে। তবে তবুও অন্ধভাবে বিশ্বাস করা এই জাতীয় ঘটনা উপস্থিত রয়েছে কেবল নিষ্পাপ নয়, বোকা। যতক্ষণ আপনি কী ব্যাখ্যা করবেন না, কীভাবে বা কেন যে এই উত্তরটি অকেজো।
ব্যবহারকারী568109

4
@ gnasher729 "এটি গতির প্রশ্ন ছিল না" - যারা অসাধু বক্তৃতা কৌশল ব্যবহার করে তাদের আমি বিতর্ক করব না।
জিম বাল্টার

2

তারা উভয় সমান - একই।

স্পেসিফিকেশন অনুসারে যেটি 0 নয় এটি সত্য বলে বিবেচিত হয়, সুতরাং কোনও অপ্টিমাইজেশন ছাড়াই এবং একটি ভাল সংকলক (1) অথবা (2) এর জন্য কোনও কোড তৈরি করে না। সংকলকটির জন্য একটি সাধারণ চেক তৈরি করা হবে != 0


@ ডিজেচলিন - কারণ তারা উভয়ই 1 সিপিইউ চক্র গ্রহণ করে।
আঙ্কেলকিং

সংকলক ধ্রুব এটিকে ভাঁজ করে, তাই এটি রান সময়েও মূল্যায়ন করা হয় না।
পলএইচকে

2

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

এবং তাই এটি আরও বেশি সময় ব্যয় ...

"যখন (2)" হাস্যকর, কারণ,

"যখন (1)", এবং "যখন (সত্য)" historতিহাসিকভাবে এমন একটি অসীম লুপ তৈরির জন্য ব্যবহৃত হয় যা প্রত্যাশা করে যে "ব্রেক" একটি অবস্থার উপর ভিত্তি করে লুপের ভিতরে কোনও পর্যায়ে ডাকা হবে যা অবশ্যই ঘটবে।

"1" কেবল সর্বদা সত্যের কাছে মূল্যায়ন করার জন্য এবং তাই "যখন (2)" বলতে "" (1 + 1 == 2) "বলতে যতটা নির্বোধ তা সত্যকেও মূল্যায়ন করবে simply

এবং আপনি যদি সম্পূর্ণ নির্বোধ হতে চান তবে কেবল ব্যবহার করুন: -

while (1 + 5 - 2 - (1 * 3) == 0.5 - 4 + ((9 * 2) / 4)) {
    if (succeed())
        break;
}

আইডিকে ভাবতে চাই যে আপনার কোডার একটি টাইপ করেছেন যা কোডটি চলমানের উপর প্রভাব ফেলেনি, তবে তিনি যদি ইচ্ছাকৃতভাবে "2" কে কেবল অদ্ভুতভাবে ব্যবহার করেন তবে তিনি আপনার কোডের মাধ্যমে অদ্ভুত শ চাপানোর আগে তাকে বরখাস্ত করুন! পড়ুন এবং সাথে কাজ।


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

@ প্যালেক: মন্তব্যের জন্য ধন্যবাদ। আমি দেখতে পেয়েছি যে একই লোকটি আমার পোস্টগুলিতে অনেকগুলি সম্পাদনা করেছিল, বেশিরভাগই কেবল সাইন অফটি সরাতে। সুতরাং আমি বুঝতে পেরেছিলাম যে তিনি কেবল একটি খ্যাতি ট্রল, এবং তাই তার খ্যাতি। অনলাইন ফোরামগুলি কি ভাষা - এবং সাধারণ সৌজন্যে এতটাই হ্রাস পেয়েছে যে আমরা আর আমাদের লেখায় স্বাক্ষর করি না? হতে পারে আমি কিছুটা পুরাতন স্কুল তবে এটিকে হ্যালো ও বিদায় বাদ দেওয়া অসভ্য বলে মনে হচ্ছে। আমরা অ্যাপস ব্যবহার করছি তবে আমরা এখনও মানুষ are
নির্মাতা

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

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

পরিশেষে সাইন ইন, অভিবাদন,…: এই আনুষ্ঠানিকতাগুলি অন্তর্ভুক্ত না করা অভদ্র মনে হতে পারে, তবে এটি শব্দের অনুপাতের সংকেত বাড়িয়ে তোলে এবং কোনও তথ্য হারিয়ে যায় না। আপনি যে কোনও ডাকনাম চান তা চয়ন করতে পারেন, এটি আপনার স্বাক্ষর। বেশিরভাগ জায়গায় আপনার অবতারও রয়েছে।
পেরেক

1

এটি সংকলকের উপর নির্ভর করে।

যদি কোডটি অনুকূলিত হয়, বা যদি এটি নির্দিষ্ট নির্দেশের সেটের জন্য একই সংখ্যার নির্দেশাবলী সহ 1 এবং 2 টি সত্য বলে মূল্যায়ন করে তবে কার্যকর করার গতি একই হবে।

প্রকৃত ক্ষেত্রে এটি সর্বদা সমান দ্রুত হবে তবে এটি নির্দিষ্টভাবে সংকলক এবং একটি নির্দিষ্ট সিস্টেমের কল্পনা করা সম্ভব হবে যখন এটি আলাদাভাবে মূল্যায়ন করা হবে।

মানে: এটি আসলে কোনও ভাষা (সি) সম্পর্কিত প্রশ্ন নয়।


0

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

সতর্ক: আপনাকে নিশ্চিত করতে হবে যে লুপটি সর্বদা সর্বদা একবার চালিত হবে

লুপটির ভিতরে একটি বিরতির অবস্থা হওয়া উচিত।

এছাড়াও এই ধরণের লুপের জন্য আমি ব্যক্তিগতভাবে ড {} এর ব্যবহার পছন্দ করি তবে (42) যেহেতু 0 বাদ ব্যতীত কোনও পূর্ণসংখ্যা কাজটি করে।


লুপের সময় তিনি কেন একটি করণীয় প্রস্তাব করবেন? (1) (বা যখন (2)) একই কাজ করে।
ক্যাটসুনামি

যখন আরও একটি অতিরিক্ত লাফ সরিয়ে দেয় তখন আরও ভাল পারফরম্যান্স। অবশ্যই আপনি যেখানে জানেন যে লুপটি অন্তত একবার কার্যকর করা হবে
আন্তোনিন গ্যাভ্রিল

0

সুস্পষ্ট উত্তরটি: পোস্ট হিসাবে, উভয় টুকরা সমান ব্যস্ত অসীম লুপ চালাবে, যা প্রোগ্রামটিকে অসীমভাবে ধীর করে দেয়

যদিও ম্যাক্রো হিসাবে সি কীওয়ার্ডগুলি পুনরায় সংজ্ঞায়িত করার সাথে প্রযুক্তিগতভাবে সংজ্ঞায়িত আচরণ হবে, কোডের টুকরোগুলি একেবারে দ্রুত করার পক্ষে আমি কেবল এটিই ভাবতে পারি: আপনি এই লাইনটি 2 টি টুকরো টপকে যোগ করতে পারেন:

#define while(x) sleep(x);

এটি অবশ্যই while(1)দ্বিগুণ দ্রুত (বা অর্ধেক ধীর) হিসাবে তৈরি করবে while(2)


@ ম্যাক্সবি: প্রকৃতপক্ষে ম্যাক্রো ট্রিকটি আরও বেশি সংহত হতে হবে। আমি মনে করি নতুন সংস্করণটি কাজ করা উচিত, যদিও এটি সি স্ট্যান্ডার্ড দ্বারা গ্যারান্টিযুক্ত নয়।
chqrlie

-4

কেন আমি আরও while(2)ধীর হতে পারি তা ভাবতে পারার একমাত্র কারণ :

  1. কোডটি লুপটিকে অনুকূলিত করে

    cmp eax, 2

  2. বিয়োগটি যখন ঘটে তখন আপনি মূলত বিয়োগ করছেন

    ক। 00000000 - 00000010 cmp eax, 2

    পরিবর্তে

    খ। 00000000 - 00000001 cmp eax, 1

cmpশুধুমাত্র পতাকা সেট করে এবং ফলাফল নির্ধারণ করে না। তাই অন্তত উল্লেখযোগ্য বিট উপর আমরা জানি যদি আমরা সঙ্গে ধার করতে বা না প্রয়োজন । অন্যদিকে a ণ নেওয়ার আগে আপনাকে দুটি বিয়োগ করতে হবে।


15
cmp উভয় ক্ষেত্রে নির্বিশেষে 1 সিপিইউ চক্র নিতে চলেছে।
আঙ্কেলকিং

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