2012-08-08 13 views
5

मैं सोच रहा हूँ।एकाधिक कथन होने की तुलना में एक सरणी का उपयोग तेजी से कर रहा है?

$value = preg_replace(array('/_{1,}/', '/-{2,}/'), array('_', '-'), $value); 
इस से

:

$value = preg_replace('/_{1,}/', '_', $value); 
$value = preg_replace('/-{2,}/', '-', $value); 

यह सिर्फ एक सरल उदाहरण है कि इस के साथ एक बेहतर प्रदर्शन है।

+7

दो शब्द: यह प्रोफ़ाइल। – deceze

+1

'$ start = microtime (true); // तुम्हारा कोड; गूंज microtime (सच) - $ शुरू; '। कई बार दोहराएं और परिणाम देखें। – Leri

+0

मैं इस पर हूं। मुझे एक मिनट दो। :) – insertusernamehere

उत्तर

3

अपने परीक्षण कोड के रूप में:

$value = 'dfkjgnnfdjgnjnfdkgn dnf gnjknkxvjn jkngjsrgn'; 
$value1 = 'dfkjgnnfdjgnjnfdkgn dnf gnjknkxvjn jkngjsrgn'; 

$start = microtime(true); 
for ($i = 0; $i < 1000000; $i++) 
$value = preg_replace(array('/_{1,}/', '/-{2,}/'), array('_', '-'), $value); 
echo microtime(true) - $start.'<br>'; 

$start1 = microtime(true); 
for ($i = 0; $i < 1000000; $i++){ 
    $value1 = preg_replace('/_{1,}/', '_', $value1); 
    $value1 = preg_replace('/-{2,}/', '-', $value1); 
} 
echo microtime(true) - $start1; 

1,4254899024963

1,2811040878296

+0

आपके प्रयास के लिए बहुत धन्यवाद। – insertusernamehere

+2

@insertusernamehere आपका स्वागत है। वैसे, आपने मुझे बहुत मदद की। मैंने अपनी परियोजना का थोड़ा सा हिस्सा अनुकूलित किया है जिसने मुझे लगभग आधा दूसरा अंतर दिया जो वर्तमान स्थिति में वास्तव में मूल्यवान है। आपको भी धन्यवाद। – Leri

+1

अच्छा SO coincidences। :) – insertusernamehere

2

microtime() परीक्षण विधि कि पीएलबी टिप्पणी में उल्लेख किया है का उपयोग करना, आप के चारों ओर देख रहे हैं प्रदर्शन में 0.3 सेकंड अंतर। दूसरा उदाहरण "तेज़" है।

+0

किस पर आधारित है? मैंने एक परीक्षण करने की कोशिश की और दूसरा तेज है। –

+0

मैंने अपने परीक्षण में एक तर्क त्रुटि को सही करने के लिए अपना जवाब संपादित किया। यह निष्पादन समय को प्रतिबिंबित करने के लिए माइक्रोटाइम फ़ंक्शन का उपयोग कर रहा है। दूसरा लगभग 3 सेकंड तक तेज है। –

+0

हम्म ठीक है, आपका स्वागत है ;-) –

1

बुला मैं एक बहुत ही कम उदाहरण है जहाँ प्रतिस्थापन करने के लिए कुछ न कुछ है बनाया का पालन करें:

$value = '1_2__3___4____5_____6______1-2--3---4----5-----6------'; 

$s_1 = microtime(true); 
    for ($i = 0; $i < 1000000; ++$i) { 
     $r_1 = preg_replace(array('/_{2,}/', '/-{2,}/'), array('_', '-'), $value); 
    } 
$e_1 = microtime(true); 

$s_2 = microtime(true); 
    for ($i = 0; $i < 1000000; ++$i) { 
     $r_2 = preg_replace('/_{2,}/', '_', $value); 
     $r_2 = preg_replace('/-{2,}/', '-', $r_2); 
    } 
$e_2 = microtime(true); 

print $r_1; 
print $r_2; 
print $e_1 - $s_1; 
print $e_2 - $s_2; 

इस परिणाम के साथ:

3,69554805756

3,2879319191

जैसा कि एक महत्वपूर्ण अंतर नहीं है - वास्तव में कोई फर्क नहीं पड़ता - जैसा कि हम बात कर रहे हैं 'एक लाख कॉल बुलाओ। यह भी दिलचस्प है कि दूसरा संस्करण "थोड़ा" तेज़ है। मुझे लगता है कि ऐसा इसलिए है क्योंकि उन सरणी के माध्यम से बनाना और चलाना।

+0

यदि आपका पैटर्न इस उदाहरण से अधिक जटिल है, तो 'एस' (अध्ययन) [संशोधक] (http://www.php.net/manual/en/reference.pcre.pattern.modifiers.php) पर एक नज़र डालें। –

+0

यह वास्तविक जटिल मुद्दों के लिए दिलचस्प लगता है। उस टिप के लिए धन्यवाद। – insertusernamehere

0

यह ध्यान रखना दिलचस्प है कि मैंने दो स्क्रिप्ट चलाईं और मेरे मामले में सरणी वाले लोग तेज़ थे।

पहले टेस्ट

2,0891699790955

2,2491400241852


दूसरे टेस्ट

3,2192239761353

3,4498269557953


सिस्टम

पीएचपी: 5.4.9

ओएस: उबंटू 64

सीपीयू: i7-3630QM

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