2009-03-11 15 views
18

मैं स्ट्रिंग को पार्स करने के लिए PHP कोड लिख रहा हूं। इसे जितनी जल्दी हो सके उतनी जल्दी होनी चाहिए, इसलिए नियमित अभिव्यक्तियों का रास्ता तय करना है? मेरे पास एक झुकाव है कि PHP स्ट्रिंग फ़ंक्शंस अधिक महंगी हैं, लेकिन यह सिर्फ एक अनुमान है। सच क्या है?PHP में अधिक कुशल, PHP स्ट्रिंग फ़ंक्शन या रीगेक्स कौन सा है?

यहाँ विशेष रूप से है मैं तार के साथ क्या करने की जरूरत: दूर कुछ भी फेंक

ले लो पहली छमाही (सबस्ट्रिंग "000000" के तीसरे स्थान के आधार पर) और अगले 20 बाइट के लिए अपनी हैश की तुलना करें, छोड़ दिया ।

डेटा के एक टुकड़े के रूप में अगले "000000" के माध्यम से 9वें बाइट को पार्स करें। उसके बाद अगले 19 बाइट्स को पकड़ लें, और इसे 8 (टॉस 1) और 8 में विभाजित करें। फिर मैं कुछ अन्य चीजें करता हूं जो उन दो 8 बाइट तारों को तिथियों में परिवर्तित करता है।

तो मुझे ऐसा करने की ज़रूरत है।

उत्तर

16

यह आपके मामले पर निर्भर करता है: यदि आप कुछ मूलभूत करने की कोशिश कर रहे हैं (उदाहरण: एक स्ट्रिंग के लिए खोज, किसी अन्य चीज़ के साथ एक सबस्ट्रिंग को प्रतिस्थापित करें), तो नियमित स्ट्रिंग फ़ंक्शन जाने का तरीका हैं। यदि आप कुछ और जटिल करना चाहते हैं (उदाहरण: आईपी पते की खोज), तो रेगेक्स फ़ंक्शन निश्चित रूप से बेहतर विकल्प हैं।

मैंने रेगेक्स का प्रोफाइल नहीं किया है, इसलिए मैं यह नहीं कह सकता कि वे रनटाइम पर तेज़ी से होंगे, लेकिन मैं आपको बता सकता हूं कि बुनियादी कार्यों का उपयोग करके समकक्ष एक साथ हैकिंग खर्च करने का अतिरिक्त समय इसके लायक नहीं होगा। ओपी में नई जानकारी के साथ


संपादित करें:

यह है जैसे कि आप वास्तव में यहाँ छोटे स्ट्रिंग आपरेशन के एक नंबर करने की जरूरत है लगता है। चूंकि प्रत्येक व्यक्ति व्यक्तिगत रूप से काफी बुनियादी है, और मुझे संदेह है कि आप एक ही समय में उन सभी चरणों (या यहां तक ​​कि कुछ चरणों में) करने में सक्षम होंगे, मैं मूल कार्यों के साथ जाऊंगा:

पहली छमाही (एक सबस्ट्रिंग "000000" के तीसरे स्थान पर आधारित) पकड़ें और इसके हैश की तुलना अगले 20 बाइट्स से करें, जो कुछ भी छोड़ दिया जाए।

उपयोग: strpos() और substr()
या: /$(.*?0{6}.*?0{6}.*?)0{6}/

फिर इसके बाद अगले 19 बाइट्स हड़पने, और विभाजित है कि में 8 (टॉस 1) और 8.

उपयोग : substr() - (मुझे लगता है कि आपका मतलब 17 बाइट्स है - 8 + 1 + 8)

$part1 = substr($myStr, $currPos, 8); 
$part2 = substr($myStr, $currPos + 9, 8); 
+1

Regexp आश्चर्यजनक रूप से कर रहे हैं कुशल। आपको आमतौर पर उन्हें डिफ़ॉल्ट उपकरण के रूप में उपयोग करने से डरना नहीं चाहिए। – troelskn

+1

@troelskn हालांकि, php के दस्तावेज़ीकरण का उल्लेख है कि वे ज्यादातर मूल संचालन के लिए मूल php फ़ंक्शन से धीमे होते हैं क्योंकि वे रेगेक्स इंजन का उपयोग नहीं करते हैं। – T0xicCode

1

मूल स्ट्रिंग फ़ंक्शन तेज़ी से तेज़ होते हैं। Regexp का लाभ यह है कि आप उनके साथ बहुत कुछ कर सकते हैं।

6

मेरा मानना ​​है कि वहां एक सीमा है जिसमें से एक नियमित अभिव्यक्ति PHP स्ट्रिंग फ़ंक्शन कॉल के समूह से तेज है। वैसे भी, आप जो कर रहे हैं उस पर बहुत निर्भर करता है। आपको संतुलन का पता लगाना होगा।

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

6

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

संपादित करें: इस विशिष्ट समस्या के लिए आपने पोस्ट किया है, मैं स्ट्रिंग ऑपरेशंस का पक्ष लेगा, लेकिन केवल इसलिए कि मुझे यह नहीं पता कि रेगेक्स में इसे कैसे किया जाए। यह हैश को छोड़कर, बहुत सीधी-आगे प्रतीत होता है, इसलिए मुझे लगता है कि रेगेक्स/स्ट्रिंग फ़ंक्शन एक बड़ा अंतर नहीं उठाएंगे।

0

आपकी आवश्यकताओं पर निर्भर करता है। अधिकांश नियमित अभिव्यक्ति संचालन एक से अधिक तेज़ होते हैं और कुछ छोटे संचालन में बिल्टिन स्ट्रिंग फ़ंक्शंस को भी बेहतर प्रदर्शन कर सकते हैं। ध्यान दें कि मेरे पास प्रीग लाइब्रेरी है, बिल्टिन रेगेक्स लाइब्रेरी नहीं, जो काफी धीमी है।

4

यदि आप जो कर रहे हैं वह स्ट्रिंग फ़ंक्शंस का उपयोग करने के लिए उचित है, तो आपको उनका उपयोग करना चाहिए। जैसे, यदि आप यह निर्धारित कर रहे हैं कि निरंतर स्ट्रिंग 'abc'$value में होती है, तो आप निश्चित रूप से strpos($value, 'abc') !== false, preg_match('/abc/', $value) पर नहीं देखना चाहते हैं। यदि आप अपने आप को रेगेक्स के साथ क्या हासिल करेंगे, तो पूरा करने के लिए स्वयं को बहुत सारी स्ट्रिंग रीफफलिंग और ट्रांसफॉर्मेशन कर रहे हैं, हालांकि, आप लगभग निश्चित रूप से प्रदर्शन और रखरखाव दोनों को नष्ट करने के लिए हवादार होने जा रहे हैं।

गति के बारे में चिंतित होने पर, हालांकि, जब यह नीचे आता है, तो इसके बारे में मत सोचो, इसे घड़ी दें। time कमांड आपके दोस्त है।

4

सामान्य रूप से, स्ट्रिंग फ़ंक्शन तेज़ होते हैं और regex फ़ंक्शन अधिक लचीले होते हैं।

किसी और चीज के साथ, आपके परिणाम भिन्न हो सकते हैं, यह सुनिश्चित करने का एकमात्र तरीका यह है कि यह दोनों तरीकों और बेंचमार्क को आजमाएं।

2

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

strpos():

$ time php -r '$i = 0; while($i++ < 1000000) strpos("abc", "a");' 

real 0m0.380s 
user 0m0.368s 
sys 0m0.008s 

() के:

$ time php -r '$i = 0; while($i++ < 1000000) preg_match("/abc/", "a");' 

real 0m0.441s 
user 0m0.432s 
sys 0m0.004s 
संबंधित मुद्दे