कौन सा तेज है: जबकि (1) या जबकि (2)?


587

यह एक वरिष्ठ प्रबंधक द्वारा पूछे गए साक्षात्कार का प्रश्न था।

कौन सा तेज है?

while(1) {
    // Some code
}

या

while(2) {
    //Some code
}

मैंने कहा कि दोनों की निष्पादन की गति समान है, क्योंकि अंदर की अभिव्यक्ति whileको आखिरकार मूल्यांकन करना चाहिए trueया false। इस स्थिति में, दोनों मूल्यांकन करते हैं trueऔर स्थिति के अंदर कोई अतिरिक्त सशर्त निर्देश नहीं whileहैं। तो, दोनों में निष्पादन की गति समान होगी और मैं (1) को प्राथमिकता देता हूं।

लेकिन साक्षात्कारकर्ता ने आत्मविश्वास से कहा: "अपनी मूल बातें जांचें। इससे while(1)तेज है while(2)।" (वह मेरे आत्मविश्वास का परीक्षण नहीं कर रहा था)

क्या ये सच है?

यह भी देखें: क्या "(के लिए?;)" से अधिक तेज है जबकि (ट्रू) "? यदि नहीं, तो लोग इसका उपयोग क्यों करते हैं?


202
एक अर्ध-सभ्य संकलक दोनों रूपों को कुछ नहीं के लिए अनुकूलित करेगा।

64
हर बार अनुकूलित निर्माण में (n), n! = 0 या for (;) को अंत में लेबल के साथ अंतहीन लूप असेंबली में अनुवाद किया जाएगा और अंत में गोटो। बिल्कुल समान कोड, समान प्रदर्शन।
एलेक्स एफ

60
आश्चर्य की बात नहीं, दोनों स्निपेट्स के 0x100000f90: jmp 0x100000f90लिए एक स्टॉक ऑप्टिमाइजेशन (पता बदलता है, जाहिर है) । साक्षात्कारकर्ता संभवत: एक रजिस्टर परीक्षण बनाम एक साधारण ध्वजांकित कूद पर हेज किया है। सवाल, और उनका दमन दोनों ही लंगड़ा है।
WhozCraig

50
साक्षात्कारकर्ता का यह प्रश्न dilbert.com/strips/comic/1995-11-17 के समान शुभचिंतकों के अंतर्गत आता है - आप किसी ऐसे व्यक्ति से मिलेंगे, जो वास्तव में अपने कथन में मूर्खता के भागफल की परवाह किए बिना जो कह रहे हैं, उस पर विश्वास करता है। बस निम्नलिखित में से चुनें: एक गहरी सांस, कसम, हंसी, रोना, ऊपर के कुछ संयोजन :)
GMasucci

3
@ माइक W: कोई आश्चर्य कर सकता है कि एक कंपाइलर को क्या करना चाहिए: हॉल्ट स्टेटमेंट में अनुवाद करें, या विचार करें कि लूप अनंत समय के बाद बाहर निकलता है और अनंत विलंब को दूर करता है?
यवेस डाएव

जवाबों:


681

दोनों लूप अनंत हैं, लेकिन हम देख सकते हैं कि कौन सा प्रति पुनरावृत्ति अधिक निर्देश / संसाधन लेता है।

Gcc का उपयोग करते हुए, मैंने अनुकूलन के विभिन्न स्तरों पर असेंबली करने के लिए निम्नलिखित दो कार्यक्रमों को संकलित किया:

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भी सच के खिलाफ एक मूल्य की तुलना के बिना लेबल, और जब तक कार्यक्रम किसी भी तरह समाप्त हो गया है निश्चित रूप से तुरंत तो फिर से करता है। यह सीधे C / C ++ कोड से मेल खाता है:

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
हो सकता है कि साक्षात्कारकर्ता gcc
MM

106
@ मट्ट मैकनाब यह एक अच्छा बिंदु है, लेकिन अगर साक्षात्कारकर्ता कंपाइलर-विशिष्ट ऑप्टिमाइज़ेशन पर भरोसा कर रहा था, तो उन्हें अपने प्रश्न में इस बारे में बहुत स्पष्ट होने की आवश्यकता है, और उन्हें "कोई अंतर नहीं है" उत्तर को स्वीकार करने की आवश्यकता है क्योंकि यह सही है कुछ (सबसे?) संकलक।
जोनाथन हार्टले

109
किसी भी संदेह को दूर करने के लिए, मैंने 3.4.2 क्लैंग में इसका परीक्षण किया और दोनों लूप हर -Oस्तर पर एक ही असेंबली का निर्माण करते हैं ।
मार्टिन टूरनोइज

16
मुझे यह बिल्कुल आश्चर्यजनक नहीं लगता क्योंकि आपने जो कुछ भी छोरों के सशर्त खंड में रखा है वह संकलन-समय स्थिरांक है। जैसे, मुझे संदेह होगा कि एक संकलक यह देखेगा कि लूप हमेशा सही या गलत होंगे और या तो सम्मानजनक रूप jmpसे शुरुआत में वापस आ जाएंगे या लूप को पूरी तरह से हटा देंगे ।
शेरेरेबल्क

10
@hippietrail मैं यह नहीं देखता कि लूप की सामग्री (या उसकी कमी) संभवतः इन अनुकूलन (किसी भी 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) तेजी से lol है, हालांकि मुझे लगता है कि यह सिर्फ एक प्रबंधक का पुराना मामला था जो खुद को समझाने की कोशिश कर रहा था कि वह कोडिंग के बारे में जानता है जब वह नहीं करता है, तो हम सभी ने इसे देखा है, हर कोई एक बनना चाहता है जेडी।
ekerner

8
बिल्कुल, यह कोई अतिशयोक्ति नहीं है। निश्चित रूप से svn-annotate या git blame(या जो भी) यहां उपयोग किया जाएगा, और सामान्य तौर पर फ़ाइल दोष इतिहास को लोड करने में मिनट लगते हैं। फिर अंत में "आह मैं समझता हूं, यह तय करने के लिए लेखक ने हाईस्कूल से बाहर ताजा होने पर यह पंक्ति लिखी", बस 10 मिनट खो दिया ...
v.oddou

11
क्योंकि मैं सम्मेलनों के बीमार हूँ, नीचे वोट दिया। डेवलपर के पास यह दंडित अवसर है कि वह अपनी पसंद का एक नंबर लिख सकता है, तो कोई उबाऊ आता है और इस बारे में बात करता है कि ऐसा क्यों नहीं है 1
उत्कर्ष गीजर

1
बयानबाजी के कारण नीचा दिखा। जबकि (1) पढ़ना ठीक उसी गति है, जबकि (2)।
hdante

4
मैं ठीक उसी मानसिक प्रक्रिया से गुज़रा जैसा कि इस उत्तर में एक मिनट पहले बताया गया था जब मैंने while(2)कोड में देखा था (नीचे विचार करने के लिए "क्या इस कोडबस के अनुरक्षकों ने (n) लूप को अलग दिखने के लिए एक अस्पष्ट टिप्पणी तंत्र के रूप में उपयोग किया है?" )। तो नहीं, आप अतिशयोक्ति नहीं कर रहे हैं!
हिशाम एचएम

151

किसी विशेष लक्ष्य के लिए एक विशेष संकलक के साथ एक विशेष संकलक द्वारा उत्पन्न कोड को दर्शाने वाले मौजूदा उत्तर पूरी तरह से प्रश्न का उत्तर नहीं देते हैं - जब तक कि उस विशिष्ट संदर्भ में सवाल नहीं पूछा गया ("जो x86_64 के लिए gcc 4.7.2 का उपयोग करते हुए तेज़ है) डिफ़ॉल्ट विकल्पों के साथ? ", उदाहरण के लिए)।

जहाँ तक भाषा की परिभाषा का संबंध है, अमूर्त मशीन 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पाश के शब्दार्थ में निहित है ; वे वास्तविक C भाव के रूप में मौजूद नहीं हैं।)

एक विकृत भोला कंपाइलर दो कंस्ट्रक्शन के लिए अलग-अलग कोड जेनरेट कर सकता है । उदाहरण के लिए, पहले के लिए यह बिना शर्त अनंत लूप ( 1एक विशेष मामले के रूप में इलाज ) उत्पन्न कर सकता है, और दूसरे के लिए यह बराबर रन-टाइम तुलना उत्पन्न कर सकता है 2 != 0। लेकिन मैंने कभी भी एक सी संकलक का सामना नहीं किया है जो वास्तव में उस तरह से व्यवहार करेगा, और मुझे गंभीरता से संदेह है कि ऐसा संकलक मौजूद है।

अधिकांश संकलक (मैं सभी उत्पादन-गुणवत्ता संकलक कहने के लिए लुभाता हूं) में अतिरिक्त अनुकूलन का अनुरोध करने के विकल्प हैं। इस तरह के एक विकल्प के तहत, यह भी कम संभावना है कि कोई भी कंपाइलर दो रूपों के लिए अलग कोड उत्पन्न करेगा।

यदि आपका कंपाइलर दो कंस्ट्रक्शन के लिए अलग-अलग कोड बनाता है, तो पहले चेक करें कि क्या अलग-अलग कोड सीक्वेंस में वास्तव में अलग-अलग परफॉर्मेंस है। यदि वे करते हैं, तो एक अनुकूलन विकल्प (यदि उपलब्ध हो) के साथ फिर से संकलन करने का प्रयास करें। यदि वे अभी भी भिन्न हैं, तो कंपाइलर विक्रेता को एक बग रिपोर्ट सबमिट करें। यह (अनिवार्य रूप से) सी मानक के अनुरूप विफलता के अर्थ में एक बग नहीं है, लेकिन यह लगभग निश्चित रूप से एक समस्या है जिसे ठीक किया जाना चाहिए।

नीचे पंक्ति: while (1)और while(2) लगभग निश्चित रूप से एक ही प्रदर्शन है। उनके पास समान शब्दार्थ है, और किसी भी संकलक के समान कोड उत्पन्न न करने का कोई अच्छा कारण नहीं है।

और यद्यपि यह एक कंपाइलर के लिए की while(1)तुलना में तेजी से कोड उत्पन्न करने के लिए पूरी तरह से कानूनी है, लेकिन एक कंपाइलर के लिए while(2)समान रूप while(1)से while(1)उसी प्रोग्राम में किसी अन्य घटना के लिए तेजी से कोड उत्पन्न करना कानूनी है ।

(आपके द्वारा पूछे गए एक और प्रश्न में निहित है: आप एक साक्षात्कारकर्ता से कैसे निपटते हैं जो एक गलत तकनीकी बिंदु पर जोर देता है। यह शायद कार्यस्थल साइट के लिए एक अच्छा प्रश्न होगा )।


8
"इस मामले में, प्रासंगिक (निहित) निरंतर अभिव्यक्तियाँ 1 हैं! = 0 और 2! = 0, जो दोनों के मान 1 का मूल्यांकन करते हैं" ... यह अत्यधिक जटिल है, और गलत है। मानक बस यह कहता है कि whileस्केलर टाइप की कंट्रोलिंग एक्सप्रेशन होनी चाहिए और लूप बॉडी को तब तक दोहराया जाता है जब तक कि एक्सप्रेशन 0. के बराबर न हो जाए। यह नहीं कहता है कि एक इम्प्लांट है expr != 0जिसका मूल्यांकन किया गया है ... जिसके परिणाम की आवश्यकता होगी कि - 0 या 1 - बदले में 0, विज्ञापन infinitum की तुलना में। नहीं, अभिव्यक्ति की तुलना 0 से की जाती है, लेकिन यह तुलना मूल्य का उत्पादन नहीं करती है। पुनश्च मैंने उत्थान किया।
जिम बेल्टर

3
@JimBalter: मैं आपकी बात देखता हूं, और मैं इसे संबोधित करने के लिए अपना जवाब अपडेट करूंगा। हालांकि, मेरा मतलब था कि मानक का शब्दांकन "... जब तक कि नियंत्रित अभिव्यक्ति 0 के बराबर हो" का अर्थ है मूल्यांकन करना <expr> == 0; यह है कि " सी के बराबर तुलना" सी में इसका मतलब है कि तुलना whileलूप के शब्दार्थ का हिस्सा है । इसका कोई निहितार्थ नहीं है, या तो मानक या मेरे उत्तर में, कि परिणाम को 0फिर से तुलना करने की आवश्यकता है । (मुझे इसके ==बजाय लिखना चाहिए था !=।) लेकिन मेरे जवाब का वह हिस्सा अस्पष्ट था, और मैं इसे अपडेट करूंगा।
कीथ थॉम्पसन

1
"" 0 के बराबर की तुलना "सी" में मतलब है - लेकिन वह भाषा मानक में है , C में नहीं ... कार्यान्वयन तुलना करता है, यह C भाषा तुलना उत्पन्न नहीं करता है। आप लिखते हैं "दोनों जिसमें से मान 1 का मूल्यांकन करते हैं" - लेकिन ऐसा कोई मूल्यांकन कभी नहीं होता है। आप के लिए तैयार किए गए कोड को देखो, तो while (2), while (pointer), while (9.67), सबसे अनुभवहीन, unoptimized संकलक द्वारा, तुम नहीं है कि पैदावार उत्पन्न किसी भी कोड दिखाई देगा 0या 1। "मुझे लिखना चाहिए == बजाय! =" - नहीं, इससे कोई मतलब नहीं होगा।
1930 को जिम बेल्टर

2
@ जिमल्टर: हम्म। मेरा मतलब यह नहीं है कि "0 के बराबर" का अर्थ ... == 0सी अभिव्यक्ति के अस्तित्व से है। मेरा कहना यह है कि दोनों " whileछोरों के बराबर की तुलना" छोरों के मानक विवरण और एक स्पष्ट द्वारा आवश्यक हैx == 0 अभिव्यक्ति के समान तार्किक रूप से एक ही ऑपरेशन के लिए आवश्यक है। और मुझे लगता है कि एक दर्दनाक भोली सी संकलक कोड उत्पन्न कर सकता है जो किसी भी लूप के लिए या का intमान उत्पन्न करता है - हालांकि मुझे विश्वास नहीं है कि कोई वास्तविक संकलक काफी भोला है। 01while
कीथ थॉम्पसन

12
नोट: यह पहले से ही एक है द वर्कप्लेस प्रश्न है: वर्कप्लेस.स्टैकएक्सचेंज
जो

141

एक मिनट रुकिए। साक्षात्कारकर्ता, क्या वह इस आदमी की तरह दिखता था?

यहाँ छवि विवरण दर्ज करें

यह काफी बुरा है कि साक्षात्कारकर्ता खुद इस साक्षात्कार में विफल रहा है , अगर इस कंपनी के अन्य प्रोग्रामर इस परीक्षण को "पास" कर चुके हैं तो क्या होगा?

नहीं। बयानों का मूल्यांकन 1 == 0और समान रूप से तेज़ 2 == 0 होना चाहिए । हम खराब कंपाइलर कार्यान्वयन की कल्पना कर सकते हैं जहां एक दूसरे की तुलना में तेज हो सकता है। लेकिन कोई एक अच्छा कारण नहीं है कि एक दूसरे की तुलना में तेज क्यों होना चाहिए।

यहां तक ​​कि अगर कुछ अस्पष्ट परिस्थिति है जब दावा सही होगा, तो प्रोग्रामर का मूल्यांकन अस्पष्ट (और इस मामले में, डरावना) सामान्य ज्ञान के आधार पर नहीं किया जाना चाहिए। इस साक्षात्कार के बारे में चिंता न करें, यहां सबसे अच्छा कदम दूर चलना है।

अस्वीकरण: यह एक मूल दिलबर्ट कार्टून नहीं है। यह महज एक मैशअप है


6
यह मज़ेदार होगा, यदि इसमें प्रश्न का उत्तर भी हो।
कोड़ी ग्रे

नहीं, लेकिन वास्तव में, हम सभी आसानी से कल्पना कर सकते हैं कि गंभीर कंपनियों द्वारा लिखे गए सभी संकलक उचित कोड का उत्पादन करेंगे। चलो "गैर-अनुकूलित मामला" / O0 लेते हैं, शायद यह खत्म हो जाएगा जैसे अनातोली ने पोस्ट किया है। फिर इसका सीपीयू का सवाल है, क्या cmpऑपरेंड 1 से 0 की तुलना में 2 से 0 की तुलना में कम चक्रों में चलेगा? सामान्य रूप से cmp को निष्पादित करने में कितने चक्र लगते हैं? क्या यह बिट पैटर्न के अनुसार परिवर्तनशील है? क्या वे अधिक "जटिल" बिट पैटर्न हैं जो धीमा करते हैं cmp? मैं व्यक्तिगत रूप से नहीं जानता। आप कल्पना कर सकते हैं कि एक सुपर आइडियल इम्प्लीमेंटेशन बिट को रैंक ० से एन (उदाहरण के लिए n = ३१) से थोड़ा बढ़ाकर।
v.oddou

5
यह मेरी बात भी है: cmpऑपरैंड 1 और 200 के लिए समान रूप से तेज़ होना चाहिए । संभवतः हम मूर्खतापूर्ण कार्यान्वयन की कल्पना कर सकते हैं जहां यह मामला नहीं है। लेकिन क्या हम एक गैर-मूर्खतापूर्ण कार्यान्वयन की कल्पना कर सकते हैं, जहां while(1)की तुलना में तेज है while(200)? इसी तरह, अगर कुछ पूर्व-ऐतिहासिक युग में, केवल उपलब्ध कार्यान्वयन इस तरह से मूर्खतापूर्ण था, तो क्या हमें आज इसके बारे में उपद्रव करना चाहिए? मुझे नहीं लगता, यह नुकीला बालों वाली बॉस की बात है, और उस पर एक असली मणि है!
जोंस

@ v.ouddou "1 से 0 की तुलना में कम चक्रों में cmp ऑपरेंड चलेगा" 0 से 0 "- नहीं। आपको सीखना चाहिए कि एक चक्र क्या है। "मैं व्यक्तिगत रूप से नहीं जानता। आप एक सुपर आइडियल कार्यान्वयन की कल्पना कर सकते हैं बिट को रैंक 0 से एन तक थोड़ा सा चेक कर सकते हैं" - या दूसरे तरीके से, फिर भी साक्षात्कारकर्ता को एक अव्यक्त बेवकूफ बना सकते हैं। और बिट को थोड़ा चेक करने की चिंता क्यों? कार्यान्वयन एक बॉक्स में एक आदमी हो सकता है जो आपके कार्यक्रम के मूल्यांकन के बीच में लंच ब्रेक लेने का फैसला करता है।
जिम बेल्टर

79

आपका स्पष्टीकरण सही है। यह एक ऐसा सवाल है जो तकनीकी ज्ञान के अलावा आपके आत्मविश्वास का परीक्षण करता है।

वैसे, अगर आपने जवाब दिया

कोड के दोनों टुकड़े समान रूप से तेज़ हैं, क्योंकि दोनों को पूरा होने में अनंत समय लगता है

साक्षात्कारकर्ता कहेंगे

लेकिन while (1)प्रति सेकंड अधिक पुनरावृत्तियों कर सकते हैं; क्या आप व्यख्या कर सकते हैं? (यह बकवास है; अपने आत्मविश्वास को फिर से परखना)

तो जैसे आपने जवाब दिया, आपने कुछ समय बचाया जो आप अन्यथा इस बुरे प्रश्न पर चर्चा करने में व्यर्थ कर देंगे।


मेरे सिस्टम पर संकलक द्वारा उत्पन्न एक उदाहरण कोड है (MS Visual Studio 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
"मैंने इसे नहीं बनाया।" - कृपया ऐसी किसी बात पर ध्यान न दें, जो बकवास कर रही हो। C का कोई बूलियन प्रकार नहीं है (यह stdbool.h में _Bool है, लेकिन यह समान नहीं है, और whileलंबे समय से पहले के शब्दार्थ ) और ऑपरेंड whileबूलियन या _Bool या किसी अन्य विशिष्ट प्रकार का नहीं है। किसी भी अभिव्यक्ति का संचालन whileहो सकता है ... जबकि 0 पर टूटता है और गैर 0 पर जारी रहता है।
जिम बाल्टर

36
"कोड के दोनों टुकड़े समान रूप से तेज़ हैं, क्योंकि दोनों को पूरा करने के लिए अनंत समय लगता है" मुझे कुछ दिलचस्प लगता है। से बयान बदल रहा है: अनंत लूप समाप्त करने के लिए केवल तरीकों के लिए एक सा आवेशित कण या हार्डवेयर में नाकाम रहने से फ़्लिप किया जाना होगा while (00000001) {}करने के लिए while (00000000) {}। अधिक सच्चे बिट्स आपके पास झूठे को फ़्लिप करने के मूल्य की कम संभावना है। अफसोस की बात है, 2 में भी केवल एक ही सच्चा सा है। 3, हालांकि, काफी लंबे समय तक चलेगा। यह केवल एक कंपाइलर पर भी लागू होता है, जो हमेशा इसे दूर नहीं करता (VC ++)।
जोनाथन डिकिंसन

8
@ mr5 nope वास्तव में कुछ इस तरह से परिणाम के लिए थोड़ा फ्लिप के लिए आप दसियों हजारों वर्षों में निष्पादन समय के बारे में बात कर रहे हैं। एक विचार प्रयोग। यदि आप एक अमर जाति से जयजयकार करते हैं, तो आप बिट-फ़्लिपिंग को अपने कार्यक्रम को प्रभावित करने से रोकने के लिए -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
@PeterCordes "मैंने कभी किसी को (आपके अलावा) नहीं सुना है कि जीसीसी या क्लैंग का -O0आउटपुट पर्याप्त रूप से साहित्यिक नहीं है।" मैंने कभी इस तरह की बात नहीं कही और मेरे मन में बिल्कुल भी सवालिया निशान नहीं था। आप मुझे गलत समझ रहे होंगे। मैं सिर्फ आपकी राय के बारे में नहीं हूँ कि MSVC जो पैदा करता है वह प्रफुल्लित करने वाला है।
ब्लबरडाइब्लूब

1
@PeterCordes मैं गलत था, MSVC while(1)में लूप से पहले ब्रेकपॉइंट नहीं टूटता है, लेकिन एक्सप्रेशन पर। लेकिन यह अभी भी लूप के अंदर ढह जाता है जब अभिव्यक्ति को दूर कर देता है। इस कोड को बहुत सारे ब्रेक के साथ लें । अडॉप्टेड डिबगिंग मोड में आपको यह मिलता है । अनुकूलन करते समय, कई ब्रेकप्वाइंट एक साथ गिरते हैं या यहां तक ​​कि अगले फ़ंक्शन में फैल जाते हैं (आईडीई डिबगिंग करते समय परिणाम ब्रेकपॉइंट दिखाता है) - संबंधित असमानता
ब्लबरडाइबुल

32

बेशक मैं इस प्रबंधक के वास्तविक इरादों को नहीं जानता, लेकिन मैं पूरी तरह से अलग दृष्टिकोण का प्रस्ताव करता हूं: जब एक नए सदस्य को एक टीम में रखा जाता है, तो यह जानना उपयोगी होता है कि वह संघर्ष स्थितियों में कैसे प्रतिक्रिया करता है।

उन्होंने आपको संघर्ष में डाल दिया। अगर यह सच है, तो वे चतुर हैं और सवाल अच्छा था। कुछ उद्योगों के लिए, जैसे बैंकिंग, आपकी समस्या को स्टैक ओवरफ़्लो में पोस्ट करना अस्वीकृति का कारण हो सकता है।

लेकिन निश्चित रूप से मुझे नहीं पता, मैं सिर्फ एक विकल्प का प्रस्ताव करता हूं।


यह वास्तव में उत्कृष्ट है, जबकि (2) बनाम जबकि (1) स्पष्ट रूप से लिबर्टी कॉमिक्स से लिया गया है। यह उनके सही दिमाग में किसी के द्वारा आविष्कार नहीं किया जा सकता है (वैसे भी किसी के साथ आने के लिए कैसे (2) किसी भी तरह से लिखना संभव है?)। यदि आपकी परिकल्पना सच थी, तो निश्चित रूप से आप एक समस्या को इतना अनोखा रूप देंगे कि आप इसके लिए गूगल कर सकें। जैसे "जबकि (0xf00b442) धीमी है, जबकि (1)", बैंक को इनरवेई का सवाल कैसे पता चलेगा? क्या आपको लगता है कि वे एनएसए हैं और चाबियों तक पहुंच है?
v.oddou

25

मुझे लगता है कि सुराग "एक वरिष्ठ प्रबंधक द्वारा पूछा गया" में पाया जाना है। इस व्यक्ति ने स्पष्ट रूप से प्रोग्रामिंग बंद कर दी जब वह एक प्रबंधक बन गया और फिर उसे वरिष्ठ प्रबंधक बनने में कई साल लग गए। प्रोग्रामिंग में कभी भी रुचि नहीं खोई, लेकिन उन दिनों के बाद से एक पंक्ति कभी नहीं लिखी। तो उनका संदर्भ "किसी भी सभ्य संकलक नहीं है" के रूप में कुछ जवाब का उल्लेख है, लेकिन "संकलक इस व्यक्ति ने 20-30 साल पहले के साथ काम किया"।

उस समय, प्रोग्रामर्स ने अपने कोड का तेज़ और अधिक कुशल बनाने के लिए विभिन्न तरीकों को आज़माने में अपना काफी समय बिताया था क्योंकि 'केंद्रीय मिनीकंप्यूटर' का सीपीयू समय इतना मूल्यवान था। जैसा कि लोगों ने कंपाइलर लिखा था। मैं अनुमान लगा रहा हूं कि उस समय उपलब्ध कराई गई एक-एक कंपाइलर को 'अक्सर सामना किए जाने वाले कथनों के आधार पर अनुकूलित किया जा सकता है' और थोड़ी देर (1) का सामना करने पर एक शॉर्टकट से लिया और सब कुछ का मूल्यांकन किया और, थोड़ी देर (2) सहित। ऐसा अनुभव होने से वह अपनी स्थिति और उस पर अपने आत्मविश्वास को समझा सकता है।

आपको काम पर रखने के लिए सबसे अच्छा तरीका शायद एक है जो वरिष्ठ प्रबंधक को दूर ले जाने में सक्षम बनाता है और आपको " साक्षात्कार के अच्छे पुराने दिनों" पर 2-3 मिनट का व्याख्यान करने से पहले आपको आसानी से अगले साक्षात्कार विषय की ओर ले जाता है। (यहां अच्छा समय महत्वपूर्ण है - बहुत तेज और आप कहानी को बाधित कर रहे हैं - बहुत धीमी गति से और आपको अपर्याप्त फोकस वाले किसी व्यक्ति के रूप में लेबल किया गया है)। साक्षात्कार के अंत में उसे बताएं कि आप इस विषय के बारे में अधिक जानने के लिए अत्यधिक इच्छुक होंगे।


19

आपको उनसे पूछना चाहिए था कि वह उस नतीजे पर कैसे पहुंचे। किसी भी सभ्य संकलक के तहत, दोनों समान निर्देश के लिए संकलन करते हैं। तो, उसे आपको कंपाइलर को शुरू करने के लिए कहना चाहिए था। और फिर भी, आपको एक सैद्धांतिक शिक्षित अनुमान बनाने के लिए संकलक और मंच को अच्छी तरह से जानना होगा। और अंत में, यह वास्तव में व्यवहार में मायने नहीं रखता है, क्योंकि स्मृति के विखंडन या सिस्टम लोड जैसे अन्य बाहरी कारक हैं जो लूप को इस विस्तार से अधिक प्रभावित करेंगे।


14
@GKFX यदि आपने अपना उत्तर दिया है और वे आपको बताते हैं कि आप गलत हैं तो कोई कारण नहीं है कि आप उन्हें यह बताने के लिए नहीं कह सकते कि क्यों। यदि अनातोलीग सही है और यह आपके आत्मविश्वास का परीक्षण है, तो आपको समझा जाना चाहिए कि आपने जिस तरह से किया था, उसी तरह से उत्तर दिया और उनसे वही पूछा।
पी। तुर्ते जुले

मेरा मतलब था पहली बात जो आप उनसे कहेंगे। यह नहीं हो सकता "क्यों x तेज है?" "मुझे नहीं पता; एक्स तेज़ क्यों है?"। जाहिर है, ठीक से उत्तर देने के बाद, आप पूछ सकते हैं।
GKFX

18

इस प्रश्न के लिए, मुझे यह जोड़ना चाहिए कि मुझे C समिति से डग ग्विन को याद करते हुए लिखना है कि आशावादी पास के बिना कुछ शुरुआती सी कंपाइलर असेंबली के लिए एक परीक्षण उत्पन्न करेंगे while(1)(तुलना करने के लिए)for(;;) जिसकी में यह नहीं होगा)।

मैं इस ऐतिहासिक नोट को देकर साक्षात्कारकर्ता को उत्तर दूंगा और फिर कहूंगा कि अगर मुझे बहुत आश्चर्य होगा कि किसी भी कंपाइलर ने ऐसा किया है, तो एक कंपाइलर हो सकता है:

  • बिना ऑप्टिमाइज़र पास के कंपाइलर दोनों के लिए एक टेस्ट जनरेट करता है 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

ऐसा लगता है कि यह उन व्यवहार साक्षात्कार साक्षात्कारों में से एक है जो एक तकनीकी प्रश्न के रूप में सामने आते हैं। कुछ कंपनियां ऐसा करती हैं - वे एक तकनीकी प्रश्न पूछेंगे जो किसी भी सक्षम प्रोग्रामर के लिए उत्तर देने के लिए काफी आसान होना चाहिए, लेकिन जब साक्षात्कारकर्ता सही उत्तर देगा, तो साक्षात्कारकर्ता उन्हें बताएगा कि वे गलत हैं।

कंपनी यह देखना चाहती है कि आप इस स्थिति में कैसे प्रतिक्रिया देंगे। क्या आप वहां चुपचाप बैठते हैं और धक्का नहीं देते हैं कि आपका उत्तर सही है, या तो आत्म-संदेह या साक्षात्कारकर्ता को परेशान करने के डर से? या क्या आप किसी ऐसे व्यक्ति को चुनौती देने के लिए तैयार हैं जिसे आप जानते हैं कि वह गलत है? वे यह देखना चाहते हैं कि क्या आप अपने दृढ़ विश्वास के लिए खड़े होने के लिए तैयार हैं, और यदि आप इसे व्यवहारिक और सम्मानजनक तरीके से कर सकते हैं।


3

मैं सी और असेंबली कोड को वापस प्रोग्राम करता था जब इस तरह की बकवास से फर्क पड़ता था। जब इससे फर्क पड़ा तो हमने इसे विधानसभा में लिखा।

अगर मुझसे यह सवाल पूछा जाता कि मैं समय से पहले अनुकूलन के बारे में डोनाल्ड नुथ के 1974 के प्रसिद्ध उद्धरण को दोहराता और अगर साक्षात्कारकर्ता हँसता और आगे नहीं बढ़ता तो चल देता।


1
यह देखते हुए कि उन्होंने यह भी कहा "स्थापित इंजीनियरिंग में 12% सुधार आसानी से प्राप्त होता है, इसे कभी भी मामूली नहीं माना जाता है और मेरा मानना ​​है कि सॉफ्टवेयर इंजीनियरिंग में समान दृष्टिकोण होना चाहिए", मुझे लगता है कि आप चलना अनुचित है।
ऐलिस

3

हो सकता है कि साक्षात्कारकर्ता ने जानबूझकर इस तरह के गूंगे प्रश्न को प्रस्तुत किया और आप 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
@JimBalter: यह गति का सवाल नहीं था, यह एक साक्षात्कारकर्ता के साथ तर्क के बारे में एक सवाल था। और संभावना है कि एक वास्तविक परीक्षण करने से साक्षात्कारकर्ता "सही" साबित हो सकता है - उन कारणों के लिए जिनका उसके तर्क से कोई लेना-देना नहीं है, लेकिन शुद्ध संयोग हैं। जो आपको गलत स्थिति में डाल देगा अगर आप यह साबित करने की कोशिश करें कि वह गलत था।
gnasher729

1
@ gnasher729 सभी तार्किक तर्क एक तरफ, संयोग का मामला जिसके बारे में आप बात करते हैं वह देखने लायक होगा। लेकिन फिर भी आंख मूंदकर इस तरह के मामले पर विश्वास करना न केवल भोली, बल्कि बेवकूफी है। जब तक आप यह नहीं बताएंगे कि क्या, कैसे या क्यों होता है, यह जवाब बेकार है।
user568109

4
@ gnasher729 "यह गति का सवाल नहीं था" - मैं उन लोगों पर बहस नहीं करूंगा जो बेईमान बयानबाजी तकनीकों को नियुक्त करते हैं।
जिम बाल्टर

2

वे दोनों समान हैं - समान।

विनिर्देशों के अनुसार कोई भी चीज़ जो 0 नहीं है, सत्य मानी जाती है, इसलिए बिना किसी अनुकूलन के भी, और एक अच्छा संकलक (1) या जबकि (2) के लिए कोई भी कोड उत्पन्न नहीं करेगा। संकलक के लिए एक सरल जाँच उत्पन्न करेगा != 0


@djechlin - क्योंकि वे दोनों 1 सीपीयू चक्र लेते हैं।
अंकल जिंग

कंपाइलर कंटीन्यू इसे फोल्ड करता है, इसलिए रन टाइम पर इसका मूल्यांकन भी नहीं होता है।
पॉलएचके

2

समय और प्रयास की मात्रा को देखते हुए लोगों ने परीक्षण किया है, साबित किया है, और इस बहुत ही सीधे प्रश्न का उत्तर देते हुए ईद का कहना है कि दोनों को प्रश्न पूछकर बहुत धीमी गति से बनाया गया था।

और इसलिए उस पर और अधिक समय बिताने के लिए ...

"जबकि (2)" हास्यास्पद है, क्योंकि,

"जबकि (1)", और "जबकि (सच)" ऐतिहासिक रूप से एक अनंत लूप बनाने के लिए उपयोग किया जाता है जो उम्मीद करता है कि "ब्रेक" एक शर्त के आधार पर लूप के अंदर कुछ अवस्था में बुलाया जाएगा जो निश्चित रूप से घटित होगा।

"1" केवल सच का मूल्यांकन करने के लिए हमेशा होता है और इसलिए, "(2)" कहने के बारे में "जबकि (1 + 1 == 2)" के रूप में मूर्खतापूर्ण है जो सच का मूल्यांकन भी करेगा।

और अगर आप पूरी तरह से मूर्खतापूर्ण उपयोग करना चाहते हैं: -

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

ईडी को लगता है कि आपके कोडर ने एक टाइपो बनाया है जो कोड के चलने पर असर नहीं डालता है, लेकिन अगर उसने जानबूझकर "2" का उपयोग अजीब होने के लिए किया है, तो अजीब सी पुट लगाने से पहले उसे बर्खास्त कर दें! आपके कोड के माध्यम से यह सब करना मुश्किल हो जाता है! साथ पढ़ें और काम करें।


आपके द्वारा किए गए रोलबैक ने एक बहुत ही उच्च प्रतिनिधि उपयोगकर्ता द्वारा संपादित किया। ये लोग आमतौर पर नीतियों को बहुत अच्छी तरह से जानते हैं और वे यहां आपको सिखाने के लिए हैं। मुझे लगता है कि आपकी पोस्ट की अंतिम पंक्ति आपके पोस्ट के लिए उपयोगी नहीं है। यहां तक ​​कि अगर मुझे मजाक मिला, मैं स्पष्ट रूप से लापता हूं, तो मैं इसे बहुत अधिक चैटिंग मानूंगा, अतिरिक्त पैराग्राफ के लायक नहीं।
पलक

@Palec: टिप्पणी के लिए धन्यवाद। मैंने पाया कि उसी आदमी ने मेरे पोस्ट को बहुत से संपादित किया, ज्यादातर केवल साइन ऑफ को हटाने के लिए। इसलिए मुझे लगा कि वह सिर्फ एक प्रतिष्ठा ट्रोल है, और इसलिए उनकी प्रतिष्ठा। क्या ऑनलाइन मंचों ने भाषा को खत्म कर दिया है - और आम शिष्टाचार - इतना कि हम अब अपने लेखन पर हस्ताक्षर नहीं करते हैं? हो सकता है कि मैं थोड़ा पुराना स्कूल हूं, लेकिन यह सिर्फ हेलोस और गुडबाय को छोड़ देने में असभ्य लगता है। हम ऐप्स का उपयोग कर रहे हैं, लेकिन हम अभी भी इंसान हैं।
इकरन

1
पर स्टैक एक्सचेंज , अभिवादन, टैगलाइन, धन्यवाद आदि स्वागत नहीं हैसहायता केंद्र में इसका उल्लेख किया गया है , विशेष रूप से अपेक्षित व्यवहार के तहत । स्टैक एक्सचेंज का कोई हिस्सा , स्टैक ओवरफ्लो भी नहीं , एक मंच है - वे क्यू एंड ए साइट्स हैं। संपादन एक अंतर है। साथ ही टिप्पणी केवल पोस्ट पर प्रतिक्रिया देने के लिए ही होनी चाहिए, चर्चा के लिए नहीं ( स्टैक ओवरफ्लो चैट )। और कई अन्य तरीके हैं क्यू एंड ए एक मंच से अलग है। में है कि अधिक सहायता केंद्र और पर मेटा स्टैक ओवरफ़्लो
पलक

ध्यान दें कि जब आपके पास 2000 से अधिक प्रतिनिधि (विशेषाधिकार संपादित करें) होते हैं, तो आप संपादन से अधिक प्रतिनिधि नहीं प्राप्त करते हैं। जब संदेह है कि आप अपनी पोस्ट पर लागू होने से असहमत क्यों हैं और इसे संपादित करते हैं, या आप किसी के दुर्व्यवहार को देखते हैं, तो मेटा स्टैक ओवरफ्लो पर पूछें । यदि संपादक ने गलत काम किया, तो उन्हें एक मॉड द्वारा सूचित किया जा सकता है (शायद उन्हें एहसास नहीं था) या यहां तक ​​कि किसी भी तरह से दंडित किया जा सकता है (यदि व्यवहार जानबूझकर दुर्भावनापूर्ण है)। अन्यथा आपको यह समझाने के लिए संकेत मिलते हैं कि संपादन / व्यवहार सही क्यों है। अनावश्यक रोलबैक क्लस्टर्स इतिहास में संशोधन करते हैं और आपको रोलबैक युद्ध में शामिल कर सकते हैं। मैं केवल तभी वापस आता हूं जब वास्तव में यह सुनिश्चित हो कि संपादन गलत है।
पलक

अंत में हस्ताक्षर करने, अभिवादन के बारे में…: यह इन औपचारिकताओं को शामिल नहीं करने के लिए अशिष्ट लग सकता है, लेकिन यह शोर अनुपात को संकेत बढ़ाता है और कोई जानकारी नहीं खो जाती है। आप कोई भी उपनाम चुन सकते हैं, जो आपका हस्ताक्षर है। ज्यादातर जगहों पर आपका अवतार भी है।
पेलिक

1

यह संकलक पर निर्भर करता है।

यदि यह कोड का अनुकूलन करता है, या यदि यह एक विशेष अनुदेश सेट के लिए समान निर्देशों के साथ 1 और 2 का सही मूल्यांकन करता है, तो निष्पादन की गति समान होगी।

वास्तविक मामलों में यह हमेशा समान रूप से तेज़ होगा, लेकिन एक विशेष संकलक और एक विशेष प्रणाली की कल्पना करना संभव होगा जब यह अलग तरीके से मूल्यांकन किया जाएगा।

मेरा मतलब है: यह वास्तव में एक भाषा (C) संबंधित प्रश्न नहीं है।


0

चूंकि इस सवाल का जवाब तलाशने वाले लोग सबसे तेज़ लूप चाहते हैं, इसलिए मैंने जवाब दिया होगा कि दोनों समान विधानसभा कोड में समान रूप से संकलन कर रहे हैं, जैसा कि अन्य उत्तरों में कहा गया है। फिर भी आप साक्षात्कारकर्ता को 'लूप अनरोलिंग' का उपयोग करने का सुझाव दे सकते हैं ; लूप करते समय {} करें बजाय लूप है।

सावधान: आपको यह सुनिश्चित करने की आवश्यकता है कि लूप कम से कम हमेशा एक बार चलेगा

लूप के अंदर एक ब्रेक की स्थिति होनी चाहिए।

इसके अलावा, उस तरह के लूप के लिए मैं व्यक्तिगत रूप से do () का उपयोग करना पसंद करूंगा, जबकि (42) किसी भी पूर्णांक के बाद, 0 को छोड़कर काम करूंगा।


वह लूप करते समय {} को सुझाव क्यों देगा? जबकि (1) (या जबकि (2)) वही काम करता है।
कैट्सुनमी

जबकि एक अतिरिक्त कूद इतना बेहतर प्रदर्शन निकालता है। निश्चित रूप से उस मामले में जहां आप जानते हैं कि लूप को कम से कम एक बार क्रियान्वित किया जाएगा
एंटोनिन गेवल

0

स्पष्ट उत्तर है: जैसा कि पोस्ट किया गया था, दोनों टुकड़े समान रूप से व्यस्त अनंत लूप चलाएंगे, जो प्रोग्राम को असीम रूप से धीमा कर देता है

यद्यपि मैक्रोज़ के रूप में सी कीवर्ड को फिर से परिभाषित करना तकनीकी रूप से अपरिभाषित व्यवहार होगा, यह एकमात्र तरीका है जिसके बारे में मैं यह सोच सकता हूं कि या तो कोड टुकड़ा तेजी से बना: आप इस लाइन को 2 टुकड़ों के ऊपर जोड़ सकते हैं:

#define while(x) sleep(x);

यह वास्तव में while(1)दोगुना तेज़ (या आधा धीमा) होगा while(2)


@MaxB: वास्तव में मैक्रो ट्रिक और भी विपरीत होना चाहिए। मुझे लगता है कि नए संस्करण को काम करना चाहिए, हालांकि सी स्टैंडर्ड द्वारा गारंटी नहीं दी गई है।
चकरली

-4

एकमात्र कारण मैं सोच सकता हूं कि while(2)कोई भी धीमा क्यों होगा:

  1. कोड लूप को अनुकूलित करता है

    cmp eax, 2

  2. जब घटाव होता है तो आप अनिवार्य रूप से घटाते हैं

    ए। 00000000 - 00000010 cmp eax, 2

    के बजाय

    ख। 00000000 - 00000001 cmp eax, 1

cmpकेवल झंडे सेट करता है और परिणाम सेट नहीं करता है। तो कम से कम महत्वपूर्ण बिट्स पर हम जानते हैं कि क्या हमें उधार लेने की जरूरत है या नहीं बी के साथ । साथ जबकि एक आप इससे पहले कि आप एक उधार मिलता है दो subtractions प्रदर्शन करने के लिए किया है।


15
सीएमपी दोनों मामलों में परवाह किए बिना 1 सीपीयू चक्र लेने जा रहा है।
अंकलकिंग जूल

8
वह कोड गलत होगा। सही कोड या तो 2 या 1 को रजिस्टर
ईएक्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.