किस विधि को स्ट्रैस या स्ट्रैप्स पसंद किया जाता है?


84

मैंने देखा कि बहुत सारे डेवलपर्स एक स्ट्रिंग और स्ट्रैस दोनों का उपयोग कर रहे हैं एक विकल्प अस्तित्व के लिए जांच करने के लिए। क्या उनमें से एक को प्राथमिकता दी जाती है और क्यों?


2
आपने जिस बेंचमार्क का उल्लेख किया है, वह है बनाम स्ट्रैस नहीं स्ट्रैस
फ्लास्क

जवाबों:


125

PHP ऑनलाइन मैनुअल से :

यदि आप केवल यह निर्धारित करना चाहते हैं कि क्या किसी विशेष सुई को छेद के भीतर होता है, तो strpos() इसके बजाय तेज और कम मेमोरी गहन फ़ंक्शन का उपयोग करें।


13
+1, आप स्ट्रैप या स्ट्रिप का उपयोग कर सकते हैं। और === FALSE का उपयोग करने के बारे में php डॉक्टर पर चेतावनी की जाँच करना न भूलें;
फेडमीच

7
फेडमिच की टिप्पणी पर विस्तार से बताने के लिए: मैं हमेशा उपयोग करता हूं if(strpos($haystack,$needle) !== false) { // do something }, कभी नहीं if(strpos($haystack,$needle)) { // do bad things }strpos0 लौटेगा, अगर $needleशुरुआत में बहुत है $haystack, और 0 झूठे के बराबर माना जाता है। (0 == false)सत्य का मूल्यांकन करता है। (0 === false)असत्य का मूल्यांकन करता है।
ब्यूटेल बटुक

1
सी से आने वाले लोगों के उपयोग के बारे में सोच सकते हैं strchr समारोह, लेकिन PHP में यह वास्तव में के लिए एक उपनाम है strstr , तो strpos एक बेहतर विकल्प है।
e2-e4

38

यहाँ कुछ अन्य उत्तर (+ मानक) हैं जो मुझे मेरे प्रश्न के लिए मिले, जो लगभग एक ही है (मुझे पूछने पर आपका एहसास नहीं हुआ)।


इस बीच में मैं अपनी बेंचमार्क परीक्षण है, जो मैं प्रत्येक प्रासंगिक कार्यों के लिए 1000000 बार भाग गया बनाया ( strstr(), strpos(), stristr()और stripos())।
यहाँ कोड है:

<?php

function getmicrotime() {
    list($usec, $sec) = explode(" ", microtime());
    return ((float) $usec + (float) $sec);
}

$mystring = 'blahblahblah';  
$findme = 'bla';  

echo 'strstr & strpos TEST:<pre>';
$time_start = getmicrotime();
for($i=0; $i<1000000; $i++) strstr($mystring, $findme);
$time_needed_strstr = getmicrotime() - $time_start;
echo 'strstr():            ',
    round( $time_needed_strstr , 8 ). PHP_EOL;

$time_start = getmicrotime();
for($i=0; $i<1000000; $i++) stristr($mystring, $findme);
$time_needed_stristr = getmicrotime() - $time_start;
echo 'stristr():           ',
    round( $time_needed_stristr , 8 ) . PHP_EOL;

$time_start = getmicrotime();
for($i=0; $i<1000000; $i++) strpos($mystring, $findme) !== false;
$time_needed_strpos = getmicrotime() - $time_start;
echo 'strpos() !== false:  ',
    round( $time_needed_strpos , 8 ) . PHP_EOL;

$time_start = getmicrotime();
for($i=0; $i<1000000; $i++) stripos($mystring, $findme) !== false;
$time_needed_stripos = getmicrotime() - $time_start;
echo 'stripos() !== false: ',
    round( $time_needed_stripos , 8 ) . PHP_EOL;

echo PHP_EOL;

echo 'time_needed_stristr - time_needed_strstr: ',
     round( $time_needed_stristr - $time_needed_strstr , 8) . PHP_EOL;
echo 'time_needed_stripos - time_needed_strpos: ',
     round( $time_needed_stripos - $time_needed_strpos , 8) . PHP_EOL;

echo PHP_EOL;

echo 'time_needed_strstr  - time_needed_strpos:  ',
     round( $time_needed_strstr - $time_needed_strpos , 8) . PHP_EOL;
echo 'time_needed_stristr - time_needed_stripos: ',
     round( $time_needed_stristr - $time_needed_stripos , 8) . PHP_EOL;

echo '</pre>';

?>

और यहाँ पहला आउटपुट है, जो दिखाता है कि strpos()विजेता है :

strstr & strpos TEST:
strstr():            2.39144707
stristr():           3.65685797
strpos() !== false:  2.39055395
stripos() !== false: 3.54681897

time_needed_stristr - time_needed_strstr: 1.2654109
time_needed_stripos - time_needed_strpos: 1.15626502

time_needed_strstr  - time_needed_strpos:  0.00089312
time_needed_stristr - time_needed_stripos: 0.110039 

अगला एक पहले आउटपुट के समान है ( strpos()फिर से विजेता है):

strstr & strpos TEST:
strstr():            2.39969015
stristr():           3.60772395
strpos() !== false:  2.38610101
stripos() !== false: 3.34951186

time_needed_stristr - time_needed_strstr: 1.2080338
time_needed_stripos - time_needed_strpos: 0.96341085

time_needed_strstr  - time_needed_strpos:  0.01358914
time_needed_stristr - time_needed_stripos: 0.25821209

नीचे एक और है, जो अधिक दिलचस्प है, क्योंकि इस मामले में, strstr()विजेता है:

strstr & strpos TEST:
strstr():            2.35499191
stristr():           3.60589004
strpos() !== false:  2.37646604
stripos() !== false: 3.51773095

time_needed_stristr - time_needed_strstr: 1.25089812
time_needed_stripos - time_needed_strpos: 1.14126492

time_needed_strstr  - time_needed_strpos:  -0.02147412
time_needed_stristr - time_needed_stripos: 0.08815908

इसका मतलब यह वास्तव में "पर्यावरणीय परिस्थितियों" पर निर्भर कर सकता है , जो कभी-कभी प्रभावित करने के लिए कठिन होते हैं, और इस तरह "माइक्रो ऑप्टिमाइज़ेशन कार्यों" के परिणाम को बदल सकते हैं, अगर आप अभी जांच कर रहे हैं कि क्या एक स्ट्रिंग दूसरे में मौजूद है या नहीं।

लेकिन मुझे लगता है कि ज्यादातर मामलों में, strpos()की तुलना में विजेता है strstr()

मुझे उम्मीद है कि यह परीक्षण किसी के लिए उपयोगी था।


3
हालांकि यह बेंचमार्क उपयोगी है, यह मेमोरी की खपत को मापता नहीं है, साथ ही यह लंबे स्ट्रिंग्स को भी ध्यान में नहीं रखता है, जैसे किबाइट्स या मैबाइट्स।

है ना? @ user133408 लंबे तार और बड़े बाइट के तार को अधिक समय लगेगा।
NiCk न्यूमैन

7

कई डेवलपर्स माइक्रो ऑप्टिमाइज़ेशन उद्देश्यों के strposलिए उपयोग करते हैं।

strstrकेवल उपयोग करना भी काम करता है यदि परिणामस्वरूप स्ट्रिंग को बूलियन संदर्भ में गलत नहीं समझा जा सकता है।


11
यह माइक्रो ऑप्टिमाइज़ेशन नहीं है, इसे नौकरी के लिए सही फ़ंक्शन का उपयोग करना कहा जाता है । यदि मुझे स्ट्रिंग की स्थिति चाहिए, तो मैं कॉल करता हूं strpos()। अगर मुझे उस स्थिति के बाद सबस्ट्रिंग चाहिए था, तो मैं कॉल करता हूं strstr()
अलनीतक

1
@Alnitak: मैं क्या कह रहा था। यदि आप एक स्ट्रिंग की उपस्थिति की जांच करना चाहते हैं, तो उसके लिए एक फ़ंक्शन है। यदि आपको वास्तव में स्थिति की आवश्यकता है, तो एक और है। - जब आप वास्तव में स्थिति की आवश्यकता के बिना स्थिति के लिए जांच करते हैं, तो वह शायद ही "नौकरी के लिए सही फ़ंक्शन का उपयोग कर रहा है"। इरादा स्पष्ट रूप से दूर सूक्ष्म सेकंड का अनुकूलन करने के लिए है। (ऐसा नहीं है कि आपने क्या कहा?)
mario

1
@mario लेकिन ऐसा कोई फ़ंक्शन नहीं है जिसका एकमात्र उद्देश्य जाँच कर रहा है कि क्या एक विकल्प मौजूद है। प्रतिस्थापन की स्थिति (यदि मिली हो) नि: शुल्क जानकारी है एक बार जब आप वास्तव में इसे पा लेते हैं। OTOH, आवश्यकता से अधिकstrstr करता है, यही कारण है कि यह धीमा है।
अलनीतक

@ अलनीतक: माइंड यू, नॉट न्यूज। आप प्रदर्शन के अंतर को इंगित करने के बारे में बहुत ही आक्रामक लगते हैं, और केवल यही। यह माइक्रो ऑप्टिमाइज़ेशन का एक टेल स्टोरी साइन है। यह प्रोफाइलर में ब्लिप नहीं बनाता है । जहां इससे फर्क पड़ता है वह कोड पठनीयता में है।
मारियो

@mario वास्तव में मैं केवल प्रदर्शन के बारे में बहुत कम परवाह करता हूं। मैं नौकरी के लिए सही फ़ंक्शन का उपयोग करने के बारे में बहुत परवाह करता हूं ;-)
Alnitak

0

strpos () पता लगाता है कि एक विशेष सुई में कहाँ निहित है। stristr () परीक्षण करता है कि क्या सुई कहीं हैस्टैक में नहीं है

इसके बाद के संस्करण () तेजी से और कम स्मृति खपत है

स्ट्रैस का एक कारण (): यदि आपकी सुई एक स्ट्रिंग की शुरुआत में है, तो स्ट्रैट्स रिटर्न 0 (इसलिए इसे = झूठी के साथ जांचना होगा)


6
यह एक पूरी तरह से फर्जी स्पष्टीकरण है - strstr()सुई से पहले या बाद में सब कुछ लौटाता है, इसलिए इसे पहले इसके समकक्ष करना होगा strpos() और फिर उस विकल्प को बनाना होगा । वहीं प्रदर्शन हिट है।
अलनीतक

-2

मैं strstr()पठनीयता और आसान कोडिंग के लिए पसंद करता हूं .. strpos() !==false थोड़ा भ्रमित है।


1
strstrसे भी ज्यादा दूर हैstrtr
श्री कृष्ण ब्राइडिस

strstrएक सख्त तुलना की भी आवश्यकता है उदाहरण:('123450', '0')
एल्विस सियोटी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.