सबसे पहले, मैं समझता हूं कि 90% अनुप्रयोगों में प्रदर्शन अंतर पूरी तरह से अप्रासंगिक है, लेकिन मुझे सिर्फ यह जानना होगा कि कौन सा निर्माण तेजी से हो रहा है। वह और ...
वर्तमान में नेट पर उन पर उपलब्ध जानकारी भ्रमित कर रही है। बहुत से लोग कहते हैं कि फॉर्च्यूनर खराब है, लेकिन तकनीकी रूप से इसे तेज होना चाहिए क्योंकि यह इटेरेटर्स का उपयोग करके एक सरणी ट्रैवर्सल लिखने को सरल बनाने के लिए माना जाता है। Iterators, जो फिर से तेज़ होने का अनुमान लगा रहे हैं, लेकिन PHP में भी स्पष्ट रूप से धीमी गति से मृत हैं (या यह एक PHP चीज नहीं है?)। मैं सरणी फ़ंक्शन के बारे में बात कर रहा हूं: अगले () prev () रीसेट () आदि अच्छी तरह से, अगर वे फ़ंक्शन भी हैं और उन PHP भाषा सुविधाओं में से एक नहीं है जो फ़ंक्शन की तरह दिखते हैं।
इसे थोड़ा कम करने के लिए : मैं 1 से अधिक (कुछ भी नकारात्मक कदम नहीं है, यानी उलटा चलना) के चरणों में ट्रेवर्सिंग ट्रे में दिलचस्प नहीं हूं। मैं मनमाने ढंग से और केवल 0 से लंबाई तक के ट्रैवर्सल में दिलचस्पी नहीं ले रहा हूं। मैं एक नियमित आधार पर 1000 से अधिक कुंजी के साथ सरणियों में हेरफेर नहीं देखता, लेकिन मैं एक सरणी को एक आवेदन के तर्क में कई बार फंसता हुआ देखता हूं! संचालन के लिए भी, मोटे तौर पर केवल स्ट्रिंग हेरफेर और गूंज।
यहाँ कुछ संदर्भ साइटें हैं:
http://www.phpbench.com/
http://www.php.lt/benchmark/phpbench.php
मैं हर जगह सुनता हूं:
foreach
धीमा है, और इस प्रकारfor
/while
तेज है- PHP
foreach
उस सरणी को कॉपी करती है जिस पर वह पुनरावृति करता है; इसे तेज़ करने के लिए आपको संदर्भों का उपयोग करने की आवश्यकता है - इस तरह कोड: एक से अधिक तेज है
$key = array_keys($aHash); $size = sizeOf($key);
for ($i=0; $i < $size; $i++)foreach
यहाँ मेरी समस्या है। मैंने यह टेस्ट स्क्रिप्ट लिखी है: http://pastebin.com/1ZgK07US और कोई फर्क नहीं पड़ता कि मैं कितनी बार स्क्रिप्ट चलाता हूं, मुझे कुछ इस तरह मिलता है:
foreach 1.1438131332397
foreach (using reference) 1.2919359207153
for 1.4262869358063
foreach (hash table) 1.5696921348572
for (hash table) 2.4778981208801
संक्षेप में:
foreach
foreach
संदर्भ से तेज हैforeach
से तेज हैfor
foreach
for
एक हैश तालिका के लिए की तुलना में तेजी है
क्या कोई समझा सकता है?
- क्या मुझसे कुछ गलत हो रही है?
- क्या PHP foreach संदर्भ चीज़ वास्तव में एक अंतर बना रही है? मेरा मतलब है कि यदि आप संदर्भ से गुजरते हैं तो इसे कॉपी क्यों नहीं करेंगे?
- फॉर्च्यूमेंट स्टेटमेंट के लिए समान इटरेटर कोड क्या है; मैंने नेट पर कुछ देखा है, लेकिन हर बार जब मैं उनका परीक्षण करता हूं तो समय समाप्त हो जाता है; मैंने कुछ सरल पुनरावृत्तियों के निर्माण का भी परीक्षण किया है, लेकिन कभी भी अच्छे परिणाम प्राप्त करने के लिए प्रतीत नहीं होता है - क्या PHP में सरणी पुनरावृत्तियों सिर्फ भयानक हैं?
- वहाँ तेजी से तरीके / तरीके / निर्माण हालांकि यह करने के लिए एक सरणी के अलावा / FOREACH (और WHILE) हैं?
PHP संस्करण 5.3.0
संपादित करें: उत्तर यहां के लोगों की मदद से मैं सभी प्रश्नों के उत्तर एक साथ दे पा रहा था। मैं उन्हें यहाँ संक्षेप में बताऊंगा:
- "क्या मुझसे कुछ गलत हो रही है?" सर्वसम्मति से प्रतीत होता है: हाँ, मैं बेंचमार्क में प्रतिध्वनि का उपयोग नहीं कर सकता। व्यक्तिगत रूप से, मैं अभी भी यह नहीं देख पा रहा हूं कि निष्पादन के यादृच्छिक समय के साथ इको कुछ कार्य कैसे होता है या कोई अन्य फ़ंक्शन किसी भी तरह से कैसे भिन्न होता है - और उस लिपि की क्षमता केवल हर चीज की तुलना में बेहतर फॉर्च्यूनर के सटीक समान परिणाम उत्पन्न करने के लिए कठिन है हालांकि समझाने के लिए "आप इको का उपयोग कर रहे हैं" (अच्छी तरह से मुझे क्या उपयोग करना चाहिए था)। हालांकि, मैं मानता हूं कि परीक्षण कुछ बेहतर होना चाहिए; हालांकि एक आदर्श समझौता दिमाग में नहीं आता है।
- "क्या PHP foreach संदर्भ चीज़ वास्तव में एक अंतर बना रही है? मेरा मतलब है कि यदि आप संदर्भ से गुजरते हैं तो इसे कॉपी क्यों नहीं करेंगे?" ircmaxell से पता चलता है कि हाँ यह है, आगे के परीक्षण से साबित होता है कि ज्यादातर मामलों में संदर्भ तेज होना चाहिए - हालांकि कोड के ऊपर मेरे स्निपेट को देखते हुए, निश्चित रूप से सभी का मतलब यह नहीं है। मैं स्वीकार करता हूं कि इस तरह के स्तर पर परेशान करने के लिए मुद्दा शायद गैर-सहज है और इसके लिए कुछ चरम की आवश्यकता होगी जैसे कि वास्तव में यह निर्धारित करने के लिए विघटित करना जो प्रत्येक स्थिति के लिए बेहतर है।
- "फॉर्च्यूमेंट स्टेटमेंट के लिए समान इटरेटर कोड क्या है? मैंने नेट पर कुछ देखा है, लेकिन हर बार जब मैं उनका परीक्षण करता हूं तो समय समाप्त हो जाता है; मैंने कुछ सरल इटरेटर निर्माणों का भी परीक्षण किया है लेकिन कभी भी अच्छे परिणाम प्राप्त नहीं होते हैं। - क्या PHP में सरणी पुनरावृत्तियाँ केवल भयानक हैं? " ircmaxell ने उत्तर दिया bellow; हालांकि कोड केवल PHP संस्करण> = 5 के लिए मान्य हो सकता है
- "वहाँ तेजी से तरीके / तरीके / निर्माण करने के लिए हालांकि एक सरणी के अलावा / FOREACH (और WHILE)?" धन्यवाद उत्तर के लिए गॉर्डन जाओ। PHP5 में नए डेटा प्रकारों का उपयोग करना या तो एक प्रदर्शन को बढ़ावा देना या मेमोरी बूस्ट देना चाहिए (या तो आपकी स्थिति के आधार पर वांछनीय हो सकता है)। हालांकि गति के नए प्रकार के बहुत से सरणी सरणी () से बेहतर नहीं लगते हैं, लेकिन शानदार और स्प्लोबजेस्टस्टोरेज काफी तेजी से प्रतीत होते हैं। गॉर्डन द्वारा प्रदान की गई लिंक: http://matthewturland.com/2010/05/20/new-spl-features-in-php-5-3/
आप सभी को धन्यवाद जिन्होंने मदद करने की कोशिश की।
मैं संभवतः किसी भी सरल ट्रैवर्सल के लिए फॉरच (गैर-संदर्भ संस्करण) से चिपके रहूंगा।