एक स्ट्रिंग की जांच करने का सबसे तेज़ तरीका जावास्क्रिप्ट में एक और विकल्प है?


163

मैं जावास्क्रिप्ट पर एक प्रदर्शन के मुद्दे के साथ काम कर रहा हूँ। इसलिए मैं सिर्फ यह पूछना चाहता हूं: यह जांचने का सबसे तेज़ तरीका क्या है कि क्या एक स्ट्रिंग में दूसरा विकल्प है (मुझे बस बूलियन मूल्य की आवश्यकता है)? क्या आप कृपया अपना विचार और नमूना स्निपेट कोड सुझा सकते हैं?


क्या आप एक निश्चित विकल्प के बारे में पूछ रहे हैं, या क्या आपको एक नियमित अभिव्यक्ति की आवश्यकता है (मैं regexटैग के उपयोग से थोड़ा भ्रमित हूं )?
टिम पीत्ज़ेकर

1
यह पोस्ट सहायक होगी .. stackoverflow.com/questions/1789945/javascript-string-contains
mtk

व्हाट्सएप के चारों ओर एक सरणी में स्ट्रिंग को विभाजित करने और एक सरणी चौराहे के बारे में कैसे? stackoverflow.com/questions/1885557/…
जियोर्जियो

जवाबों:


315

आपके पास दो अधिभोग हैं:

  1. नियमित अभिव्यक्ति :

    (new RegExp('word')).test(str)
    // or
    /word/.test(str)
  2. indexOf:

    str.indexOf('word') !== -1

नियमित अभिव्यक्तियाँ तेज़ लगती हैं (कम से कम क्रोम 10 में)।

प्रदर्शन परीक्षण - छोटी बाधा
प्रदर्शन परीक्षण - लंबी बाधा


अपडेट 2011:

यह निश्चित रूप से नहीं कहा जा सकता है कि कौन सी विधि तेज है। ब्राउज़रों के बीच अंतर बहुत बड़ा है। जबकि क्रोम 10 indexOfमें, सफ़ारी 5 में, तेजी से प्रतीत होता है, indexOfस्पष्ट रूप से किसी भी अन्य विधि की तुलना में धीमा है।

आपको अपने स्वयं के लिए देखना होगा और प्रयास करना होगा। यह आपकी आवश्यकताओं पर निर्भर करता है। उदाहरण के लिए केस-असंवेदनशील खोज नियमित अभिव्यक्ति के साथ तेजी से होती है।


अपडेट 2018:

बस लोगों को स्वयं परीक्षण चलाने से बचाने के लिए, यहां सबसे आम ब्राउज़रों के लिए वर्तमान परिणाम हैं, प्रतिशत अगले सबसे तेज परिणाम (जो ब्राउज़रों के बीच भिन्न होता है) पर प्रदर्शन में वृद्धि दर्शाता है:

Chrome: indexOf (~ 98% तेज़) <-- wow
फ़ायरफ़ॉक्स: कैशेड RegExp (~ 18% तेज़ी)
IE11: कैशेड RegExp (~ 10% तेज़ी)
एज: indexOf (~ 18% तेज़ी)
सफारी: कैशेड RegExp (~ 0.4% तेज़)

ध्यान दें कि कैश किया गया RegExp है: var r = new RegExp('simple'); var c = r.test(str);के विपरीत:/simple/.test(str)


3
यह तभी थोड़ा तेज हो सकता है जब पाठ-से-खोज के लिए हाथ से पहले जाना जाता है (यानी एक चर में संग्रहीत नहीं किया जाता है) क्योंकि रेगेक्स को पार्स समय के दौरान जावास्क्रिप्ट इंजन द्वारा बनाया गया है। यदि आप किसी अन्य स्ट्रिंग चर के अंदर एक चर में निहित स्ट्रिंग की खोज करना चाहते हैं, तो indexOf सबसे तेज़ है क्योंकि आपको एक RegExp ऑब्जेक्ट बनाने और विशेष वर्णों से बचने के लिए स्ट्रिंग को संसाधित करने की आवश्यकता होगी आदि
स्टीफन चुंग

अनुभव से, indexOf तेजी से केस-संवेदी खोज के लिए यदि आप जो कुछ भी आप पहली बार खोज कर रहे हैं पर .toLowerCase का उपयोग किया जा सकता है
Hayk Saakian

मैं Microsoft Office Javascript API का उपयोग करते हुए, और indexOfकाम नहीं कर रहा है , एक Office 2013 App लिख रहा हूँ । मुझे यकीन नहीं है कि क्यों। Regex का उपयोग हालांकि करता है। यह एक बढ़त का मामला है, लेकिन अन्य लोग एक ही मुद्दे में भाग सकते हैं।
एंडी मर्सर

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

1
@ बाइसन: आप केवल तभी उपयोग कर सकते हैं जब आप पहले से ही जानते हों कि कहां देखना है। मैंने केवल जेनेरिक समाधानों पर ध्यान केंद्रित किया।
फेलिक्स क्लिंग

17

क्या यह आपके लिए कार्य करता है?

string1.indexOf(string2) >= 0

संपादित करें: यदि स्ट्रिंग 2 में बार-बार पैटर्न होता है, तो यह किसी RegExp से तेज नहीं हो सकता है। कुछ ब्राउज़रों पर, IndexOf RegExp की तुलना में बहुत धीमा हो सकता है। टिप्पणी देखो।

संपादित करें 2: RegExp इंडेक्सऑफ से तेज हो सकता है जब तार बहुत लंबे होते हैं और / या दोहराया पैटर्न होते हैं। टिप्पणियों और @ फेलिक्स का उत्तर देखें।


लेकिन यह अन्य तरीकों से तुलना कैसे करता है? क्या यह सबसे तेज़ है, या यह ऐसा करने के कई तरीकों में से एक है?
Chii

यह तेजी से होना चाहिए क्योंकि यह जावास्क्रिप्ट द्वारा ही लागू किया जाता है (यानी यह देशी कोड चलाता है)। जावास्क्रिप्ट कोड पर आधारित कोई अन्य विधि धीमी होगी। यदि आप सटीक स्ट्रिंग जानते हैं, तो एक रेगीक्स थोड़ा तेज हो सकता है (जैसा कि जावास्क्रिप्ट इंजन को खोजने के लिए प्रोटिंड श्रृंखला चलने के लिए नहीं है ।indexOf)।
स्टीफन चुंग

यदि आपको केस-असंवेदनशील खोज की आवश्यकता है, तो आपको निश्चित रूप से एक RegExp ऑब्जेक्ट बनाने और कॉल करने की आवश्यकता होगी test
स्टीफन चुंग

3
बस सफारी में एक परीक्षण किया। indexOfकिसी अन्य विधि की तुलना में एक परिमाण धीमा है। इसलिए यह वास्तव में नहीं कहा जा सकता है कि कौन सी विधि तेज है। यह ब्राउज़र से ब्राउज़र में भिन्न होता है।
फेलिक्स क्लिंग

@ फेलिक्स, यह एक अच्छा अवलोकन है (कभी भी किसी चीज पर भरोसा न करें जब तक कि आप वास्तव में इसे स्वयं नहीं आजमाते)! मुझे कुछ याद है जो कई बार दोहराए गए पैटर्न के साथ तार में कहते हैं, रेगेक्स को एक साधारण लूप तुलना कार्यान्वयन की तुलना में तेजी से प्रदर्शन करना चाहिए क्योंकि रेगेक्स को राज्य मशीनों में संकलित किया गया है और यह सरल छोरों की तुलना में बहुत तेज ट्रैक कर सकता है - जिसे हमेशा वापस करना होता है- अगले चरित्र के लिए ट्रैक। प्रयोग करने और इसे बाहर लाने के लिए +1!
स्टीफन चुंग

17

सबसे तेज़

  1. (ईएस 6) शामिल हैं
    var string = "हैलो",
    प्रतिस्थापन = "लो";
    string.includes (सबस्ट्रिंग);
  1. ES5 और पुराने indexOf
    var string = "हैलो",
    प्रतिस्थापन = "लो";
    string.indexOf (स्थानापन्न)! == -1;

http://jsben.ch/9cwLJ

यहां छवि विवरण दर्ज करें


8

ईएस 6 में, includes()विधि का उपयोग यह निर्धारित करने के लिए किया जाता है कि क्या एक तार दूसरे स्ट्रिंग के भीतर पाया जा सकता है, लौटकर trueया falseउपयुक्त के रूप में।

var str = 'To be, or not to be, that is the question.';

console.log(str.includes('To be'));       // true
console.log(str.includes('question'));    // true
console.log(str.includes('nonexistent')); // false

यहाँ के बीच jsperf है

var ret = str.includes('one');

तथा

var ret = (str.indexOf('one') !== -1);

जैसा कि परिणाम jsperf में दिखाया गया है, ऐसा लगता है कि दोनों ही अच्छा प्रदर्शन करते हैं।


क्या मैं "रेगेक्स" का उपयोग कर सकता हूं, जैसा कि 'तर्क' शामिल है? जैसे str.includes("x|y"):; उसी कॉल में शाब्दिक "x" या "y" की खोज करें।
पीटकैटो

@Patrick, प्रति डॉक्टर शामिल करें, आप इसमें उपयोग नहीं कर सकते regex। आपके प्रश्न के लिए एक काम है,str.includes("x") || str.includes('y')
झंगवाड

Chrome 59 जावास्क्रिप्ट में सुधार के परिणामस्वरूप, (1600% तेजी से ऊपर) की indexOfतुलना में काफी तेज है includes। यह स्पष्ट नहीं है कि 44 मिलियन पुनरावृत्तियों / सेकंड और 777+ मिलियन i / सेकंड का अंतर वास्तविक दुनिया के प्रदर्शन को कैसे प्रभावित करता है, हालांकि मोबाइल संभावनाएं पर्याप्त लाभ देती हैं जो indexOfआदर्श विकल्प होना चाहिए।
चाड लेवी

7

मैंने पाया, पाश के लिए एक सरल का उपयोग कर स्ट्रिंग में सभी तत्वों से अधिक पुनरावृत्ति और का उपयोग कर की तुलना कि charAtतेजी से प्रदर्शन indexOfया Regex। कोड और सबूत JSPerf पर उपलब्ध है ।

ETA: indexOfऔर charAtदोनों jsperf.com पर सूचीबद्ध ब्राउज़र स्कोप डेटा के अनुसार क्रोम मोबाइल पर समान रूप से भयानक प्रदर्शन करते हैं


अजीब बात है कि एक हाथ से बना फ़ंक्शन एक में निर्मित से बेहतर है, लेकिन मुझे लगता है कि यह इसलिए है क्योंकि सुई केवल एक चरित्र है। अभी भी ...
मॉस

Apple iPad (iOS 7.1.1) पर Chrome मोबाइल 36.0.1985.57 में परीक्षण किया गया। IndexOf तेज है। क्षमा करें
rpax

Chrome मोबाइल को छोड़कर , सभी प्लेटफ़ॉर्म (jsperf से इतिहास पर आधारित) पर @rpax CharAt अभी भी काफी तेज़ है , जहाँ IndexOf और CharAt दोनों ही डेस्कटॉप की तुलना में बहुत खराब प्रदर्शन करते हैं।
wpg4665

1
मैं यह देखना चाहता हूं कि यह NodeJS में कैसा प्रदर्शन करता है, और यह भी वास्तव में एक अच्छा उदाहरण नहीं है क्योंकि आप केवल एक चरित्र बनाम एक विकल्प की तलाश में हैं।
कोडेनिन्जा

यह बिल्कुल भी मान्य उत्तर नहीं है। आप एक
सबरिंग की

3

एक साधारण स्ट्रिंग खोजने के लिए, indexOf () विधि का उपयोग करना और रेगेक्स का उपयोग करना बहुत अधिक है: http://jsperf.com/substring - इसलिए कभी भी ऐसा चुनें जो लिखने में आसान लगे।



1

.match()स्ट्रिंग के लिए विधि का उपयोग करना आसान तरीका है ।

var re = /(AND|OR|MAYBE)/;
var str = "IT'S MAYBE BETTER WAY TO USE .MATCH() METHOD TO STRING";
console.log('Do we found something?', Boolean(str.match(re)));

आपको शुभ दिन की शुभकामनाएं, श्रीमान!


4
matchजब कोई testविधि हो तो कोई कारण नहीं ... शीर्ष उत्तर देखें।
बरगी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.