2011-11-10 18 views
6

मैं, के लिए प्रोफाइल है जबकि और करते-करते हुए कुछ सरल के साथ छोरों:php में सबसे तेज़ लूप है?

while ($var < 1000000) { 
    ++$var; 
} 

do { 
    ++$var; 
} while ($var < 1000000); 

for ($var = 0; $var < 1000000; ++$var) { 
    //do nothing 
} 

microtime (तुलना करके) पहले और छोरों के बाद।

डू-लूप लूप एक सबसे बड़ी मात्रा में सबसे तेज़ लूप है। डू-जबकि वास्तव में से अधिक तेज़ है जबकि लगभग आधा है। मुझे पता है कि वे विभिन्न उद्देश्यों के लिए हैं (जबकि लूप निष्पादन से पहले की स्थिति की जांच करता है और डू-जबकि कम से कम एक बार निष्पादित करता है)।

मुझे पता है कि आम सहमति यह है कि जबकि लूप फेंक रहे हैं और करते हैं-जबकि भी अधिक।

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

मेरा वर्तमान स्वीकृत उत्तर यह है कि कोड की योग्यता संदिग्ध है।

+0

क्या आप अपना बेंचमार्किंग परिणाम पोस्ट कर सकते हैं? – bot403

+1

मैंने कभी इस आम सहमति को नहीं देखा है कि जबकि लूप खराब हैं। वे किसी भी अन्य की तरह PHP टूलकिट में एक उपकरण हैं। –

+0

लूप्स के दौरान कौन फहराता है? केवल आधे समय का उपयोग करना बहुत पसंद है, लेकिन आपको वास्तविक समय को मापना चाहिए। आप कुछ भी नहीं बचा रहे हैं। – martinstoeckli

उत्तर

15
  1. माइक्रो अनुकूलन बुराई हैं। वे नहीं मापनीय प्रदर्शन लाभ के लिए पठनीयता को कम करते हैं। यहां तक ​​कि यदि आपके आवेदन में लाखों इटरेटर (जो मुझे संदेह है) के साथ लूप है तो अंतर अभी भी नगण्य है।
  2. while/do while के बीच अंतर छोटा होता है की तुलना में आप कहते हैं: http://codepad.viper-7.com/M8cgt9
  3. को समझने के लिए क्यों do while मामूली तेजी से होता है, उत्पन्न opcodes को देखो:

    line  # * op       fetch   ext return operands 
    --------------------------------------------------------------------------------- 
    # while loop 
        3  0 > ASSIGN             !0, 0 
        4  1 > IS_SMALLER          ~1  !0, 1000000 
         2 > JMPZ              ~1, ->5 
         3 > PRE_INC             !0 
         4 > JMP              ->1 
         5 > > RETURN             1 
    # do while loop 
        3  0 > ASSIGN             !0, 0 
        4  1 > PRE_INC             !0 
         2  IS_SMALLER          ~2  !0, 1000000 
         3 > JMPNZ             ~2, ->1 
        4  > > RETURN             1 
    # for loop 
        3  0 > ASSIGN             !0, 0 
         1 > IS_SMALLER          ~1  !0, 1000000 
         2 > JMPZNZ          5   ~1, ->6 
         3 > PRE_INC             !0 
         4 > JMP              ->1 
         5 > > JMP              ->3 
         6 > > RETURN             1 
    

    do while पाश केवल एक कूद बयान है (JMPNZ), जबकि while लूप को दो (JMPZ, JMP) की आवश्यकता है। for लूप को तीन कूद विवरण (JMPZNZ, JMP, JMP) की आवश्यकता होती है और आमतौर पर अधिक जटिल तर्क होता है।

+0

मुझे ऐसा नहीं लगता है। अगर उसे इसके लिए भुगतान किया जाता है। अगर वह इसे पसंद करता है। जब इसके लाखों इटरेटर होते हैं तो यह समझ में आता है। – Bytemain

+0

@ जितामारो, भले ही लाखों पुनरावृत्तियों हैं, जबकि लूप के अंदर सामान करने में व्यतीत समय के मुकाबले लगभग/हमेशा के दौरान अंतर हमेशा नगण्य होता है। – Marcus

+0

लूप नगण्य है, एल्गोरिदम गति, ले लिया गया स्मृति अधिक महत्वपूर्ण है – andho

1

यदि आप एक तेज पाश चाहते हैं तो आपको इसे अनलोल करना होगा या एक डफ डिवाइस का उपयोग करना होगा।

तुम भी शॉर्टकट के लिए लूप (demo) कर सकते हैं:

for ($var = 0; ++$var < 10;) { 
    // do nothing 
} 

तुम भी शॉर्टकट कर सकते हैं do-, जबकि लूप (demo):

$var=0; 
do { 
    echo "Hello"; 
} while (++$var < 10); 

लेकिन opcodes ही हैं।

If you're already using the fastest algorithms you can find (on the order of O(1),  
O(n), or O(n log n)), and you're still worried about loop speed, unroll your loops 
using e.g., Duff's Device: 

<?php 
$n = $ITERATIONS % 8; 
while ($n--) $val++; 
$n = (int)($ITERATIONS/8); 
while ($n--) { 
    $val++; 
    $val++; 
    $val++; 
    $val++; 
    $val++; 
    $val++; 
    $val++; 
    $val++; 
} 
?> 

(यह, गूंथा हुआ आटा के मूल उपकरण का एक संशोधित रूप है, क्योंकि पीएचपी
मूल के प्रबल वाक्य रचना नहीं समझती:

और यहाँ php.net से डफ डिवाइस का एक संशोधित संस्करण है।)

गणितीय कलन विधि आम रूप के बराबर है:

<?php 
for ($i = 0; $i < $ITERATIONS; $i++) { 
    $val++; 
} 
?> 

$val++ can be whatever operation you need to perform ITERATIONS number of times. 

On my box, with no users, average run time across 100 samples with ITERATIONS =  
10000000 (10 million) is: 
Duff version:  7.9857 s 
Obvious version: 27.608 s 
0

यदि आप उस तरह की चीज़ में रुचि रखते हैं, तो आपको PHPBench दिलचस्प लगता है।

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

संबंधित मुद्दे