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


164
for (;;) {
    //Something to be done repeatedly
}

मैंने देखा है कि इस तरह की चीज़ों का बहुत उपयोग किया जाता है, लेकिन मुझे लगता है कि यह अजीब है ... क्या यह कहना बहुत स्पष्ट नहीं होगा while(true), या उन रेखाओं के साथ कुछ?

मैं अनुमान लगा रहा हूं (जैसा कि कई-प्रोग्रामर के लिए क्रिप्टोकरेंसी का सहारा लेने का कारण है) यह एक छोटा मार्जिन है?

क्यों, और क्या यह वास्तव में इसके लायक है? यदि हां, तो इसे इस तरह से परिभाषित क्यों न करें:

#define while(true) for(;;)

यह भी देखें: जो तेज है: जबकि (1) या जबकि (2)?


51
क्या है TRUE???
एनटी

20
@Steven Sudit: TRUEC के साथ क्या करना है? C99 में सच बुलियन परिणाम के लिए मानक मैक्रो अभी भी है true। कहां से TRUEआया?
22:10

31
यह मैक्रो काम नहीं करता है, #define EVER ;;हालांकि IOCCC में उपयोग किया गया है .. :)

18
क्या उस मैक्रो को #define while(TRUE)घोषित करने के लिए मैक्रो TRUEनहीं है, जिसे एक तर्क दिया जाता है जिसे कभी भी उपयोग नहीं किया जाता है, इसलिए आपके प्रोग्राम में लूप करते हुए हर एक को अनंत लूप में बदल दिया जाता है?
AshleysBrain

9
@Steven Sudit: नहीं। वीएस 6.0 में कोई मानक मैक्रो नहीं है। मैक्रो TRUEविंडोज एपीआई से जुड़ी हेडर फाइलों से आता है। यह किसी भी तरह से वीएस 6.0 से संबंधित नहीं है। और, जैसा कि मैंने पहले कहा, इसका C या C ++ से कोई लेना-देना नहीं है। C ++ में "सच" शाब्दिक है true(वीएस 6.0 में भी), C89 / 90 में ऐसा बिल्कुल भी नहीं है, और C99 में यह मैक्रो है true। यह सभी C / C ++ कंपाइलर पर लागू होता है।
चींटी

जवाबों:


262
  1. यह तेज नहीं है।
  2. यदि आप वास्तव में देखभाल करते हैं, तो अपने मंच के लिए कोडांतरक आउटपुट के साथ संकलन करें और देखें।
  3. इससे कोई फर्क नहीं पड़ता। यह कभी मायने नहीं रखता। अपने अनंत छोरों को लिखें हालांकि आपको पसंद है।

227
सहज रूप से, एक अनंत लूप का अनुकूलन अनंत गति की क्षमता प्रदान करता है। अच्छी बात यह है कि हम अंतर्ज्ञान पर कार्यक्रम नहीं करते हैं। :-)
स्टीवन सुदित

5
मुझे लगता है आप ठीक कह रहे हैं। मुझे लगता है कि मैं छोटी-छोटी बातों को लेकर "धार्मिक" बहस में फंस गया था। मेरे विवेक को शिथिल करने के लिए धन्यवाद। : डी
क्रिस कूपर

6
@Steven LOL, यह दिलचस्प है, लेकिन फिर विचार करें कि एकमात्र परिदृश्य जहां आप वास्तव में अनंत गति तक पहुंच गए हैं, जब लूप कभी टूटता नहीं है और वास्तव में असीम रूप से चलता है, जो कि संभवतः एक बग है, या यदि इरादा है, तो होगा उस क्षमता तक पहुँचने से पहले एक अनंत प्रतीक्षा।
एरोनल्स

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

3
इससे कोई फर्क नहीं पड़ा, क्योंकि कुछ प्लेटफार्मों पर शुरुआती कंपाइलरों ने एक निरंतर लोड किया और इसकी एक सशर्त छलांग लगाई। जो उन दिनों हार्डवेयर पर बात करते थे।
पेट्रिएन

176

मैं for(;;)दो कारणों से पसंद करता हूं ।

एक यह है कि कुछ संकलक चेतावनी उत्पन्न करते हैं while(true)(कुछ ऐसा है जैसे "लूप की स्थिति स्थिर है")। चेतावनियों से बचना हमेशा एक अच्छी बात है।

एक और यह है कि मुझे लगता for(;;)है कि स्पष्ट और अधिक बता रहा है। मुझे एक अनंत लूप चाहिए। यह सचमुच है कोई शर्त, यह कुछ भी पर निर्भर करता है। मैं चाहता हूं कि यह हमेशा के लिए जारी रहे, जब तक कि मैं इससे बाहर निकलने के लिए कुछ नहीं करता।

जबकि while(true), ठीक है, कुछ भी करने के लिए क्या सच है? मैं तब तक लूपिंग में दिलचस्पी नहीं लेता, जब तक कि सच गलत न हो जाए, जो कि इस रूप में शाब्दिक रूप से कहता है (लूप सच है जबकि सच है)। मैं सिर्फ लूप करना चाहता हूं।

और नहीं, बिल्कुल कोई प्रदर्शन अंतर नहीं है।


73
चेतावनी से बचने के लिए +1। लेकिन स्पष्टता के रूप में, मैं इस संदर्भ में की तुलना में स्पष्ट है। मुझे लगता है कि पहलू सिर्फ व्यक्तिगत पसंद के लिए नीचे आता है।
टिम

14
हां, तरजीह और आदत। यदि आप देखने के अभ्यस्त नहीं हैं for(;;), तो यह स्पष्ट रूप से अजीब लगेगा। लेकिन मैं इसकी आदत हो क्योंकि यह प्रयास करने की अनुशंसा करता हूँ है एक आम मुहावरा है, और आप इसे फिर से में चलाने जा रहे हैं। ;)
जलफ

7
इसके बारे में जलफ की टिप्पणी मुहावरेदार है। यह आमतौर पर "अनंत लूप" बस क्योंकि इसके लिए प्रयोग किया जाता है है कि यह सिर्फ एक आत्म मजबूत सम्मेलन है - वहाँ एक मुहावरा के लिए एक अच्छा कारण हो की जरूरत नहीं है सी में "अनंत लूप" लिखने के अधिक इस्तेमाल किया तरीका है।
कैफ़े

7
@ सच: मैं नहीं देखता कि मैं कभी क्यों इस्तेमाल करूँगा for(;condition;)। यही कारण है कि एक समय लूप के लिए है । लेकिन जैसा कि मैंने कहा, एक अनंत लूप के साथ, मैं वास्तव में किसी भी हालत की तुलना करने के लिए संकलक नहीं चाहता हूं । Naively, एक whileलूप के साथ , इसे trueहर पुनरावृत्ति का परीक्षण करना होगा (जाहिर है, डंबेस्ट कंपाइलर भी ऐसा नहीं करेगा, लेकिन यह सिद्धांत है जो मुझे परेशान करता है। यह मुझे आपके कोड की देखरेख के रूप में प्रभावित करता है), जबकि for(;;)आप सचमुच कह रहे हैं। "परीक्षण करने के लिए कोई शर्त नहीं है। बस लूप"। मुझे यह आपकी कल्पना के सबसे करीब के बराबर लगता हैloop {...}
jalf

32
अगर while(true)कोई चेतावनी देता है तो आपका कंपाइलर बेकार हो जाता है।
अल्बर्ट

56

व्यक्तिगत रूप से मैं उपयोग करता हूं for (;;)क्योंकि इसमें कोई संख्या नहीं है, यह सिर्फ एक कीवर्ड है। मैं पसंद इसे करने के लिए while (true), while (1), while (42), while (!0)आदि आदि


38
0, 1, और अनन्तता स्वीकार्य जादू संख्याएं हैं, 0 और 1 को गलत और सत्य तक विस्तारित करना नुकसान नहीं है। trueइससे अधिक कोई जादू की संख्या नहीं forहै एक जादू कीवर्ड है या जो for(;;)एक निहित जादू अनंत का उपयोग करता है। ( while (42)वास्तव में एक घृणा है।)

38
स्पर्शरेखा: मेरे सीएस प्रोफेसरों में से एक ने कहा "प्रोग्रामिंग में केवल तीन नंबर हैं: 0, 1, और एन। बाकी कुछ भी एक जादू नंबर कहा जाता है।"
बेन ज़ोटो

21
जबकि (४२) सबसे ठंडा है, जबकि (१) या जबकि (सत्य) या जबकि (०) के संबंध में कोई अलग परिणाम नहीं देता है और इसका दार्शनिक अर्थ है। मुझे लगता for(;;)है कि वैसे भी दूसरों की तुलना में तेजी से पार्स किया जाता है
शिनटेकज़ू

2
@ShinTakezou से बेहतर #define LIFE 42 while (LIFE):)
mr5

1
अच्छी तरह से while(true)किसी भी संख्या में शामिल नहीं है। और (;;) के लिए कोई कीवर्ड नहीं है
RiaD

49

डेनिस रिची की वजह से

  • मैंने इसका उपयोग करना शुरू कर दिया है, for (;;)क्योंकि जिस तरह से डेनिस रिची ने यह कश्मीर एंड आर में किया है, और एक नई भाषा सीखने के दौरान मैं हमेशा स्मार्ट लोगों की नकल करने की कोशिश करता हूं।

  • यह मुहावरेदार C / C ++ है। यदि आप C / C ++ स्थान पर बहुत कुछ करने की योजना बना रहे हैं, तो इसका उपयोग करने के लिए लंबे समय में यह संभवतः बेहतर है।

  • आपका #defineकाम नहीं होगा, क्योंकि बात को परिभाषित करने के लिए # सी पहचानकर्ता की तरह दिखना होगा।

  • सभी आधुनिक संकलक दो निर्माणों के लिए समान कोड उत्पन्न करेंगे।


10
हाँ, यह है कि आप कैसे जानते हैं कि किसी ने K & R से C सीखा, जिस तरह से इसे सीखना चाहिए। जब भी मैं देखता हूं while(TRUE), मुझे संदेह है कि प्रोग्रामर एक सी नौसिखिया है, या सी फॉर फॉर डमीज पुस्तक से सीखा है।
क्रिस्टोफर जॉनसन

13
मैंने सुना है कि उन newbies newfangled फ़ंक्शन परिभाषा शैली का भी उपयोग करते हैं।
जस्टिन

46

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

यदि आप जिज्ञासु हैं, तो यहाँ gcc 4.4.1 मुझे x86 के लिए क्या देता है। दोनों x86 JMP इंस्ट्रक्शन का उपयोग करते हैं ।

void while_infinite()
{
    while(1)
    {
    puts("while");
    }
}

void for_infinite()
{
    for(;;)
    {
    puts("for");
    }
}

संकलन (भाग में):

.LC0:
.string "while"
.text
.globl while_infinite
    .type   while_infinite, @function
while_infinite:
    pushl   %ebp
    movl    %esp, %ebp
    subl    $24, %esp
.L2:
    movl    $.LC0, (%esp)
    call    puts
    jmp .L2
    .size   while_infinite, .-while_infinite
    .section    .rodata
.LC1:
    .string "for"
    .text
.globl for_infinite
    .type   for_infinite, @function
for_infinite:
    pushl   %ebp
    movl    %esp, %ebp
    subl    $24, %esp
.L5:
    movl    $.LC1, (%esp)
    call    puts
    jmp .L5
    .size   for_infinite, .-for_infinite

मुझे संदेह है कि यह डिबग मोड में भी तेज है।
स्टीवन सुदित

106
for_infiniteज्यादा तेज़ है; को 2 कम वर्ण puts
डेव जार्विस

43

मुझे पसंद है for (;;)क्योंकि यह विभिन्न सी-लाइक भाषाओं में सबसे अधिक सुसंगत है।

C ++ while (true)में ठीक है, लेकिन C में आप परिभाषित करने के लिए हेडर पर निर्भर हैं true, फिर TRUEभी आमतौर पर इस्तेमाल किया जाने वाला मैक्रो है। यदि आप इसका उपयोग while (1)C और C ++, और JavaScript में सही करते हैं, लेकिन जावा या C # नहीं करते हैं, जिसके लिए लूप कंडीशन की आवश्यकता होती है जैसे बूलियन, while (true)या while (1 == 1)। PHP में, कीवर्ड केस-असंवेदनशील होते हैं लेकिन भाषा पूंजीकरण को प्राथमिकता देती है TRUE

हालांकि, for (;;)उन सभी भाषाओं में हमेशा पूरी तरह से सही है।


9
आपके उत्तर के लिए धन्यवाद! मुझे लगता है कि यह वास्तव में पहला उत्तर है जो एक उद्देश्यपूर्ण रास्ता दिखाता है जो for (;;)बेहतर है।
क्रिस कूपर

8
मुझे नहीं लगता कि मुझे कभी C, C ++, JavaScript, Java और C # में सही कोड लिखने की आवश्यकता है। वे अलग-अलग भाषाएं हैं।
कीथ थॉम्पसन

6
@KeithThompson यह कई भाषाओं में सही लिखने वाले कोड के बारे में नहीं है; मुझे लगता है कि यह विभिन्न पृष्ठभूमि वाले डेवलपर्स के बीच गलत व्याख्या से बचने के बारे में है।
मौरो सेम्पीटरो

6
@sam: दोनों while (1)और for (;;)एक सी प्रोग्राम है जो मुसीबत समझ है पढ़ने सी किसी में अनंत छोरों के लिए आम मुहावरे हैं या तो संभावना कोड के बाकी के साथ मुसीबत होगा। यह सी कोड लिखने के लिए योग्य नहीं है जो आसानी से किसी ऐसे व्यक्ति द्वारा पढ़ा जा सकता है जो सी नहीं जानता है
कीथ थॉम्पसन

6
@KeithThompson जबकि C का एक सक्षम पाठक निश्चित रूप से दोनों मुहावरों से परिचित होना चाहिए, यह भी उपयोगी हो सकता है यदि लेखक एक बहुभाषाविद प्रोग्रामर है। अपनी पिछली नौकरी में मैंने जेएस, एक्शनस्क्रिप्ट और पीएचपी में दैनिक आधार पर काम किया, और जिस तरह से एक कोड लिखते हैं (जहां ऐसा करने के लिए समझ में आता है) को एकीकृत करना प्रोग्रामिंग को तेज और रखरखाव आसान बना सकता है।
आयनोकॉस्ट ब्रिघम

21

मैं व्यक्तिगत रूप से for (;;)मुहावरे को पसंद करता हूं (जो उसी कोड को संकलित करेगा while (TRUE)

उपयोग करना while (TRUE)एक अर्थ में अधिक पठनीय हो सकता है, मैंने for (;;)मुहावरे का उपयोग करने का निर्णय लिया है क्योंकि यह बाहर खड़ा है

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

इसके अलावा, मुझे याद है कि कुछ संकलक चेतावनी जारी करते हैं जब थोड़ी देर के लूप की नियंत्रित अभिव्यक्ति एक स्थिर होती है। मुझे नहीं लगता कि ऐसा बहुत अधिक होता है, लेकिन मेरे लिए इससे बचने की चाह के लिए सिर्फ चेतावनी की संभावना काफी है।


17

मैंने देखा है कि कुछ लोग इसे पसंद करते हैं क्योंकि उनके पास कहीं न कहीं इस तरह से #define होता है:

#define EVER ;;

जो उन्हें यह लिखने की अनुमति देता है:

for (EVER)
{
    /* blah */
}

24
मैंने वह भी देखा है; लेकिन यह इसे पसंद करने का एक अच्छा कारण नहीं है। एक अनुचर के रूप में, आपको अभी भी स्थूल परिभाषा की जाँच करनी होगी ताकि यह सुनिश्चित हो सके कि यह वही है जो आप अपेक्षा करेंगे, जबकि मूल कोड पर्याप्त स्पष्ट था। RTOS VxWorks में एक मैक्रो FOREVERपरिभाषित है for(;;), लेकिन यह बेहतर नहीं है। आईएमओ मैक्रोज़ को एक नई भाषा का आविष्कार करने के लिए उपयोग नहीं किया जाना चाहिए।
क्लिफर्ड

8
दरअसल कुछ भाषाओं में मैक्रों का उद्देश्य नए वाक्य-विन्यास का आविष्कार करना है। लेकिन C / C ++ में 'for (EVER)' की परवाह किए बिना जघन्य है।
दान ओल्सन

15
कुछ लोग मजाकिया काम करते हैं, जैसे कि वे पास्कल को पसंद करते हैं #define BEGIN {और वे कहते हैं #define END }। मैंने भी देखा है #define DONKEYS_FLY (0)इसलिए वे कह सकते हैं if DONKEYS_FLY ...। कौन कहता है कि सॉफ्टवेयर सुस्त है?
माइक डनलवेई

11
कैलिफ़ोर्निया में मैं आपको इस बात के लिए आश्वस्त करता हूं कि आपको (;)) LIKE_FOREVER
मार्टिन बेकेट

1
मैं विरोध नहीं कर सकता: #define never while(0)और#define always
8

16

क्या होगा (यदि आपकी भाषा इसका समर्थन करती है):

start:
/* BLAH */
goto start;

... जो किसी भी उचित संकलक के हाथों में समान उत्पादन उत्पन्न करना चाहिए।
बेन ज़ोटो

9
+1! यह gotoकई नुकसानों की भरपाई नहीं करता है , लेकिन अगर आप जिस एल्गोरिदम को लागू करने की कोशिश कर रहे हैं, वह फ्लो-चार्ट से आता है, तो यह सबसे सीधा अनुवाद है।
एडमंड 23

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

कभी भी कभी उपयोग न करेंgoto
एडवर्ड करक

वास्तव में अच्छी बात यह है gotoकि आपको breakअपने पाश को कम अनंत बनाने के लिए किसी को जोड़ने के बारे में चिंता करने की ज़रूरत नहीं है । (जब तक आप पहले से ही एक whileऔर forलूप के अंदर न हों ...)

12

मशीन कोड उत्पन्न होने के संदर्भ में कोई अंतर नहीं है।

हालाँकि, केवल प्रवृत्ति को कम करने के लिए, मेरा तर्क है कि जबकि (TRUE) फ़ॉर्म (;;) की तुलना में बहुत अधिक पठनीय और सहज है, और यह पठनीयता और स्पष्टता किसी भी कारण से दिशानिर्देशों को कोड करने के लिए अधिक महत्वपूर्ण कारण हैं ' ((;)) दृष्टिकोण के लिए मैंने सुना है (मैं ठोस तर्क और / या प्रभावशीलता के प्रमाण पर अपने कोडिंग दिशानिर्देशों को आधार बनाना पसंद करता हूं)।


6
जो आपकी भाषा पर निर्भर करता है। for(;;)C और C ++ में ऐसा करने का पारंपरिक तरीका है। while(true)सी # और जावा और अन्य भाषाओं में सम्मेलन हो रहा है। आपकी माइलेज भिन्न हो सकती है।
बिली ओनेल

9
हां, और कोई व्यक्ति जो C या C ++ से बहुत परिचित नहीं है, उसे STRING_SCAN_FORMATTED sscanf की तुलना में अधिक पठनीय लग सकता है, लेकिन आप किसी को भी उनके कोड के शीर्ष पर #define STRING_SCAN_FORMATTTs sscanf डालते नहीं देख सकते हैं।
ta.speot.is

4
मैं कर इसके बारे में मुहावरेदार रास्ता कहेंगे बेहतर था अपने डेवलपर को सबसे को पढ़ा जा सके। अन्यथा आपको वास्तव में बेहतर डेवलपर्स की आवश्यकता है।
jalf

5
@despart: यदि कोई व्यक्ति C ++ से परिचित नहीं है, तो उस मुहावरे को पहचानने के लिए कि वह क्या है, तो उन्हें नरक को मेरे कोडबेस से दूर रहने की आवश्यकता है।
बिली ओनेल

4
मैं मानता हूं कि मुहावरेदार तरीका सबसे पठनीय होना चाहिए। यही कारण है कि मुहावरेदार तरीकों को हमेशा चुनौती देने और बदलने की आवश्यकता होती है क्योंकि भाषा और व्यवहार विकसित होते हैं। भयानक K & R "मुहावरेदार" कोडिंग शैली को आधुनिक, अधिक पठनीय शैली द्वारा प्रतिस्थापित करने में वर्षों लग गए, लेकिन यह अभी भी हुआ है।
जेसन विलियम्स

11

न केवल एक प्रसिद्ध पैटर्न, बल्कि C (और C ++) में एक मानक मुहावरा


3
हां, और मुझे लगता है कि कुछ संकलक while (true)उसी कारण से चेतावनी देते हैं जिस कारण वे करते हैं if (true)
स्टीवन सुदित

11
while(true)

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

for(;;)

पसंद है।


7
दृश्य स्टूडियो के किस संस्करण का आप उपयोग कर रहे हैं? 2008 के साथ मुझे यह चेतावनी नहीं मिली, यहां तक ​​कि चेतावनी के स्तर पर भी 4.
Jörgen Sigvardsson

11

यदि आपका कोड कंपाइलर द्वारा ऑप्टिमाइज़ किया गया है तो दोनों समान होने चाहिए। अनुकूलन से मेरा क्या मतलब है, यह समझाने के लिए, MSVC 10 में लिखा गया एक नमूना कोड है:

int x = 0;

while(true) // for(;;)
{
    x +=1;

    printf("%d", x);
}

यदि आप इसे डिबग मोड में बनाते हैं ( बिना किसी अनुकूलन (/ ओडी) के ) डिस्सैडफ़ॉर्म स्पष्ट अंतर दिखाता है। trueअंदर की स्थिति के लिए अतिरिक्त निर्देश है while

while(true)
00D313A5  mov         eax,1                //extra 
00D313AA  test        eax,eax              //extra
00D313AC  je          main+39h (0D313B9h)  //extra
    {
        x +=1;
00D313AE  mov         eax,dword ptr [x]  
00D313B1  add         eax,1  
00D313B4  mov         dword ptr [x],eax  
    printf("%d", x);
    ...
    }
00D313B7  jmp         main+25h (0D313A5h)  


for(;;)
    {
        x +=1;
00D213A5  mov         eax,dword ptr [x]  
00D213A8  add         eax,1  
00D213AB  mov         dword ptr [x],eax  
    printf("%d", x);
    ...
    }
00D213AE  jmp         main+25h (0D213A5h)  

हालाँकि, यदि आप रिलीज़ मोड में अपना कोड बनाते हैं (डिफ़ॉल्ट अधिकतम गति (/ O2) के साथ ) तो आपको दोनों के लिए समान आउटपुट मिलता है। दोनों छोरों को एक कूद निर्देश के लिए कम किया जाता है।

for(;;)
    {
        x +=1;
01291010  inc         esi  

        printf("%d", x);
    ...
    }
0129101C  jmp         main+10h (1291010h)  

    while(true)
    {
        x +=1;
00311010  inc         esi  

        printf("%d", x);
    ...
    }
0031101C  jmp         main+10h (311010h)  

आप जो भी उपयोग करेंगे वह गति अनुकूलन के साथ एक सभ्य संकलक के लिए कोई फर्क नहीं पड़ता है।


यह वास्तव में एक बहुत अच्छा बिंदु है! अनुकूलन के बिना भी आधुनिक संकलक कई निर्देशों द्वारा भिन्न होंगे।

9

यह व्यक्तिगत प्राथमिकता की बात है कि कौन सा रास्ता तेज है। व्यक्तिगत रूप से, मैं एक स्पर्शवादी हूं और कभी भी अपने कीबोर्ड को नहीं देखता, प्रोग्रामिंग के दौरान - मैं अपने कीबोर्ड पर सभी 104 कुंजी को छू सकता हूं।

मुझे लगता है कि अगर तेजी से टाइप करने के लिए "जबकि (ट्रू)"।

मैंने मानसिक रूप से कुछ उंगली आंदोलन माप जोड़े और उन्हें कुल किया। "((;))" में आंदोलनों की लगभग 12 मुख्य-चौड़ाईएँ हैं (चौथी और घर की चाबियों और कुंजियों के बीच, और घर की चाबियों और SHIFT कुंजी के बीच) "जबकि (TRUE)" में आंदोलनों की लगभग 14 मुख्य-चौड़ाईएँ हैं और चौथा।

हालाँकि, बाद में लिखते समय मैं बहुत कम त्रुटि-प्रवण होता हूँ। मैं मानसिक रूप से एक समय में शब्दों में सोचता हूं, इसलिए मुझे "nIdx" जैसे शब्दों की तुलना में "nIndex" जैसी चीज़ों को टाइप करने में तेज़ी आती है क्योंकि मुझे वास्तव में अपने मन के अंदर बोलने के बजाय पत्र को मानसिक रूप से वर्तनी देना है और अपनी उंगलियों को ऑटो करने दें शब्द को टाइप करें (जैसे साइकिल की सवारी)

(मेरा टाइपिंगटेस्ट.कॉम बेंचमार्क = 136 WPM)


3
मेरा मानना ​​है कि ओपी रनटाइम स्पीड की बात कर रहा था, टाइपिंग स्पीड की नहीं।

मुझे पता है। बस उस आधार को भी कवर करना था।
मार्क रेझॉन

7
s / व्यक्तिगत वरीयता / व्यक्तिगत आदत /
SamB

@SBB: s /// के लिए वोट करें। xD और हाँ, हालाँकि मैंने सुझाव दिया कि यह रनटाइम गति के कारण हो सकता है, मुझे वास्तविक उत्तर नहीं पता था। अगर ऐसा होता, तो मुझे खुशी होती।
क्रिस कूपर

time head -10 >/dev/nullप्रत्येक 10 बार चलाएं , और परिणाम मापें। मुझे यकीन है for(;;)कि जब तक आप धोखा नहीं देंगे तब तक आप तेज होंगे । मैं लगभग 14% था।
PSkocik

6

सभी अच्छे जवाब - व्यवहार बिल्कुल समान होना चाहिए।

कैसे - बस मान लीजिए कि यह फर्क पड़ता है। मान लीजिए कि उनमें से एक ने प्रति पुनरावृत्ति के लिए 3 और निर्देश दिए।

क्या आपको ध्यान रखना चाहिए?

केवल अगर आप लूप के अंदर करते हैं तो लगभग कुछ भी नहीं है , जो लगभग कभी नहीं होता है।

मेरा कहना है कि, माइक्रो-ऑप्टिमाइज़ेशन और मैक्रो-ऑप्टिमाइज़ेशन है। माइक्रो-ऑप्टिमाइज़ेशन "वजन कम करने के लिए बाल कटवाने" जैसा है।


3
आप कितनी बार देखते हैं कि लोगों को पसंद करने के लिए कहा ++iगया है i++?
डेनिस ज़िकफोज़ 6

7
@Dennis Zickefoose: के बीच का अंतर ++iऔर i++संभावित रूप से महत्वपूर्ण हो सकता है अगर iएक वर्ग का एक उदाहरण के बजाय है एक अंतर्निहित और संकलक तुच्छ अनुकूलन लागू नहीं होता। सलाह यह है कि एक आदत प्राप्त कर लें ताकि जब यह गिना जाए तो यह आपको पकड़ न पाए।
क्लिफर्ड

5
++iबनाम के बारे में बात i++यह है कि यह "अनुकूलन" बनाने के लिए आपको कुछ भी खर्च नहीं करता है। सच है, ज्यादातर मामलों में यह बिल्कुल कोई फर्क नहीं पड़ता है, लेकिन वे टाइप करने के लिए समान रूप से आसान हैं, इसलिए डिफ़ॉल्ट रूप से संभावित रूप से सबसे कुशल क्यों नहीं? और मुझे लगता है कि यहां भी वही लागू होता है। यदि एक दूसरे की तुलना में एक छोटा सा तेज था , तो तेजी से एक के लिए क्यों नहीं ? हम इसे करके क्या खो देंगे? दोनों पढ़ना और टाइप करना काफी आसान है।
११:५१

2
@ डेनिस ज़िकफ़ोज़: आप सही कह रहे हैं। मुझे लगता है कि एसओ और क्लिफोर्ड की टिप्पणी पर बहुत कुछ सही है। इसके अलावा, ऐसा कुछ है जो मुझे SO पर बहुत अधिक नहीं दिखता है, और वह यह है कि मैक्रो-ऑप्टिमाइज़ेशन कैसे करें, जैसे 43x स्पीडअप: stackoverflow.com/questions/926266/… । इसलिए मुझे हमारी प्राथमिकताओं पर आश्चर्य है।
माइक डनलैवी

2
@ माइक: हाँ, लेकिन यह तुलना करने के लिए संतरे के लिए एक सेब है। बाल कटवाने से वास्तविक समय लगता है, और शायद पैसे भी। मैं मानता हूं कि यह एक ऐसा माइक्रोप्टीमाइजेशन है जो वास्तव में मायने नहीं रखता। लेकिन यह भी हमें कुछ भी खर्च नहीं करता है। अगर मैं बाएं या दाएं जाना पसंद कर सकता हूं, और दूरी समान है, तो इलाके समान हैं, सब कुछ समान है, सिवाय इसके कि बाएं रास्ते का कुछ सीमांत सूक्ष्म लाभ है, तो बाएं क्यों नहीं जाना है? आप सही हैं, यह एक प्रभावशाली तर्क नहीं है। लेकिन जब लागत सचमुच शून्य होती है, तो मुझे कम इष्टतम मार्ग पसंद करने का कोई कारण नहीं दिखता है।
jalf

5

मैं कल्पना नहीं कर सकता कि एक सार्थक संकलक कोई अलग कोड उत्पन्न करेगा। अगर ऐसा हुआ भी, तो विशेष संकलक का परीक्षण किए बिना निर्धारित करने का कोई तरीका नहीं होगा जो अधिक कुशल था।

हालाँकि मेरा सुझाव है कि आप for(;;)निम्नलिखित कारणों से पसंद करते हैं :

  • मेरे द्वारा उपयोग किए गए कई संकलक उचित चेतावनी स्तर सेटिंग्स के साथ (सत्य) के लिए एक निरंतर अभिव्यक्ति चेतावनी उत्पन्न करेंगे।

  • आपके उदाहरण में मैक्रो TRUE को आपकी अपेक्षा के अनुसार परिभाषित नहीं किया जा सकता है

  • लूप के रूप में अनंत के कई संभावित रूप हैं while(1), जैसे while(true), while(1==1)आदि; इसलिए for(;;)अधिक संगति में परिणाम की संभावना है।


TRUE #define TRUE 1 नहीं हो सकता है, लेकिन कोई भी कोड आधार जिसमें while(TRUE)मूल्यांकन while(0)होता है, से लाभ होने की संभावना नहीं है for(;;)
जस्टिन

@ जस्टिन: मैं मानता हूं, यह वास्तव में विकृत होगा, और यह तीन तर्कों में सबसे मजबूत नहीं है, लेकिन बज़्ने स्टॉस्ट्रुप C ++ में NULL मैक्रो से बचने के लिए एक समान तर्क का उपयोग करता है। while(true)किसी भी मामले में प्राथमिकता दी जानी चाहिए। C ++ boolमें आरक्षित है, और C में C stdbool.h में परिभाषित किया गया है (इसे C में कम सुरक्षित बनाना)। for(;;)सभी संदेह को दूर करता है।
क्लिफोर्ड

5
for(;;Sleep(50))
{
    // Lots of code
}

से अधिक स्पष्ट है:

while(true)
{
    // Lots of code
    Sleep(50);
}

यदि आप उपयोग नहीं कर रहे हैं तो यह लागू होता है Sleep()


1
यह बहुत बुरा कोड है, टाइमर का उपयोग नींद के बजाय किया जाना चाहिए, इसलिए यह खराब उदाहरण है
ST3

12
@ ST3 - हां, आप सही हैं। मेरा कोड भयानक है। अगली बार जब मैं एक अनंत लूप बनाऊं तो मुझे और कोशिश करनी चाहिए।
अरमाडा

1
@Frammo - आपके OS पर निर्भर करता है, लेकिन आमतौर पर कुछ ऐसा होता हैtimerService.scheduleRepeating (50, [] () { /* lots of code */ });
Periata Breatta

2
एक फंक्शन को कॉल करने के बारे में कुछ भी साफ नहीं है जैसे कि सोते हुए लूप के अंदर
ग्रेग

1
OMG, टाइमरService.scheduleRepeating (50, [] () {}) केवल इतना आसान है कि टाइप करना और समझना फिर सोना (50)।
कूल जेवलिन

4

"हमेशा" लूप बैकग्राउंड लूप के रूप में एम्बेडेड सिस्टम में लोकप्रिय है। कुछ लोग इसे इस प्रकार लागू करते हैं:

for (; ;)
{
 // Stuff done in background loop
}

और कभी-कभी इसे लागू किया जाता है:

while (TRUE /* or use 1 */)
{
 // Stuff done in background loop
}

और फिर भी एक और कार्यान्वयन है:

do
{
 // Stuff done in background loop
} while (1 /* or TRUE */);

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


8
यदि एक संकलक उन लोगों के लिए अलग कोड बनाता है, तो संकलक को खोदने और पिछले दो दशकों से एक प्राप्त करने का समय है।
GManNickG

5
"इन छोरों के हमेशा के लिए चले जाने से छोरों के लिए फांसी का समय बड़ी चिंता का विषय नहीं है" - यह मेरे लिए बहुत गलत लगता है ..
Blindy

3
@ बेलिंडी - क्योंकि यह गलत है, चिंता की बात यह है कि रनटाइम खर्च किए गए प्रोसेसिंग लूपिंग लॉजिक का अंश, या उपयोगी कार्य के प्रति यूनिट लॉजिंग लॉजिक की मात्रा है, जिनमें से किसी को भी लूप द्वारा अनंत होने में मदद नहीं की जाती है
बेन वायगेट

3

मुझे लगता है जबकि (सच) के लिए (;;) से अधिक पठनीय है - प्रोग्रामर की तरह इसका लुक के लिए कुछ याद आता है :)


मुझे गति की परवाह है। खासकर यदि कोई अनुकूलन है जो मेरे कोड को अनंत बार प्रभावित करेगा।
कोवलस्की

2

जब आप खोजपूर्ण प्रोग्रामिंग करते हैं तो "for (;;)" का उपयोग करने का सबसे महत्वपूर्ण कारण "जबकि (ट्रू)" का उपयोग करने का डर है। "के लिए" के साथ पुनरावृत्ति की मात्रा को नियंत्रित करना आसान है, और "लूप" को अनंत में बदलने के लिए भी आसान है।

उदाहरण के लिए, यदि आप एक पुनरावर्ती फ़ंक्शन का निर्माण कर रहे हैं, तो आप अनंत लूप में परिवर्तित होने से पहले फ़ंक्शन को कॉल की मात्रा को सीमित कर सकते हैं।

    for(int i=0;i<1000;i++) recursiveFunction(oneParam);

जब मुझे अपने कार्य पर यकीन हो जाता है, तो मैं इसे अनंत लूप में बदल देता हूं:

    for(;;) recursiveFunction(oneParam);

3
पहले लूप में एक सिंटैक्स त्रुटि (एक अर्धविराम लापता) है।
जेन्स

3
हा! ); इस प्रकार (;;) के लिए का नकारात्मक पहलू का प्रदर्शन
एंड्रयू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.