वेबवॉकर धीमी रेगेक्सप की गणना काफी धीमी (3x) - केवल फ़ायरफ़ॉक्स से करता है


85

पहले मैंने सिर्फ अपने आप को एक रेगुलर एक्सप्रेशन बनाया जो किसी प्रोजेक्ट की सभी हेडर फाइलों की सूची में सभी बाहरी बाहरी लाइब्रेरी पथों से मेल खाएगा। मैंने एक सप्ताह पहले उस regexp को बनाने के बारे में एक सवाल पूछा था।

मैंने यह देखने के लिए चारों ओर ध्यान लगाना शुरू कर दिया कि यह कैसे अतुल्यकालिक और जब एक वेब कार्यकर्ता में बदल जाएगा। सुविधा और विश्वसनीयता के लिए मैंने यह सार्वभौमिक फ़ाइल बनाई जो सभी तीन मोड में चलती है:

/** Will call result() callback with every match it founds. Asynchronous unless called 
 *  with interval = -1.
 *  Javadoc style comment for Arnold Rimmer and other Java programmers:
 *  
 * @param regex regular expression to match in string
 * @param string guess what
 * @param result callback function that accepts one parameter, string match
 * @param done callback on finish, has no parameters
 * @param interval delay (not actual interval) between finding matches. If -1, 
 *        function  will be blocking
 * @property working false if loop isn't running, otherwise contains timeout ID
 *           for use with clearTimeout
 * @property done copy of done parameter
 * @throws heavy boulders
**/
function processRegex(regex, string, result, done, interval) {
  var m;
  //Please tell me interpreter optimizes this
  interval = typeof interval!='number'?1:interval;
  //And this
  processRegex.done = done;
  while ((m = regex.exec(string))) {
    Array.prototype.splice.call(m,0,1);
    var path = m.join("");
    //It's good to keep in mind that result() slows down the process
    result(path);
    if (interval>=0) {
      processRegex.working = setTimeout(processRegex, 
                              interval, regex, string, 
                              result, done, interval);
      // Comment these out for maximum speed
      processRegex.progress = regex.lastIndex/string.length;
      console.log("Progress: "+Math.round(processRegex.progress*100)+"%");
      return;
    }
  }

  processRegex.working = false;
  processRegex.done = null;
  if (typeof done=="function")
    done();
}
processRegex.working = false; 

मैंने एक परीक्षण फ़ाइल बनाई, इसे यहां चिपकाने के बजाय मैंने इसे बहुत विश्वसनीय वेब होस्टिंग पर अपलोड किया: डेमो - टेस्ट डेटा

मुझे जो बहुत आश्चर्य की बात है वह यह है कि RegExp के वेब वर्कर और ब्राउज़र निष्पादन के बीच इतना महत्वपूर्ण अंतर है। मुझे मिले परिणाम:

  • मोज़िला फ़ायरफ़ॉक्स
    • [WORKER]: Time elapsed:16.860s
    • [WORKER-SYNC]: Time elapsed:16.739s
    • [TIMEOUT]: Time elapsed:5.186s
    • [LOOP]: Time elapsed:5.028s

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

function processRegexUnique(regex, string, result, done, interval) {
  var matchList = arguments[5]||[];
  ... same as before ...
  while ((m = regex.exec(string))) {
    ... same as before ...
    if (matchList.indexOf(path)==-1) {
      result(path);
      matchList.push(path);
    }
    if (interval>=0) {
      processRegex.working = setTimeout(processRegex, interval, 
                               regex, string, result, 
                               done, interval, matchList);
      ... same as before ...
    }
  }
  ... same as before ...
}

और परिणाम:

  • मोज़िला फ़ायरफ़ॉक्स
    • [WORKER]: Time elapsed:0.062s
    • [WORKER-SYNC]: Time elapsed:0.023s
    • [TIMEOUT]: Time elapsed:12.250s (स्वयं नोट करें: यह हर मिनट अजीब हो रहा है)
    • [LOOP]: Time elapsed:0.006s

क्या कोई इस तरह के अंतर को गति में समझा सकता है?


6
यदि आपने इसके लिए एक फ़ायरफ़ॉक्स बग दर्ज किया है, तो क्या आप अपने प्रश्न में बग URL जोड़ सकते हैं? और अगर आपने अभी तक इसके लिए फ़ायरफ़ॉक्स बग दायर नहीं किया है, तो मुझे उम्मीद है कि आप ऐसा करने के लिए समय लेने पर विचार कर सकते हैं।
sideshowbarker

@sideshowbarker मैं googled जहां फ़ायरफ़ॉक्स बग रिपोर्ट करने के लिए और मैं विफल रहा। इसलिए मैंने फ़ायरफ़ॉक्स इनपुट (" फ़ायरफ़ॉक्स ने मुझे दुखी कर दिया") पर शिकायत दर्ज की " जहां कीड़े को रिपोर्ट करने के लिए नहीं मिल सकता है " भर दिया और छोड़ दिया। यदि आप जानते हैं कि कहां बग्स की रिपोर्ट करना है (और यह वास्तविक रिपोर्ट प्रक्रिया है, तो उपयोगकर्ता प्रतिक्रिया के लिए कुछ सिंक नहीं), कृपया मुझे बताएं। यह पहली बार नहीं होगा जब मुझे समस्या मिली कि मैं मज़बूती से पुन: पेश कर सकता हूं और केवल फ़ायरफ़ॉक्स के रूप में पहचान कर सकता हूं।
टॉम ज़ातो -

1
हाँ सहमत हुए कि वे इसे स्पष्ट नहीं कर सकते क्योंकि यह हो सकता है। वैसे भी, इस विशेष बग के लिए, कृपया bugzilla.mozilla.org/… का उपयोग करें। यह DOM: Workersउचित बगज़िला Coreउत्पाद में उपयुक्त बगज़िला घटक के खिलाफ उठाएगा ।
sideshowbarker

1
फ़ायरफ़ॉक्स ब्राउज़र-इंजन बग्स की रिपोर्ट करने के लिए यह पता लगाने की कोशिश करने में आपके द्वारा भागे गए समान कुंठाओं से बचने में अन्य लोगों की मदद करने के लिए, मैंने stackoverflow.com/questions/33059442// बनाया है, अगर आपको लगता है कि यह जानकारी यहाँ रिकॉर्ड पर रखना उपयोगी है StackOverflow, कृपया इसे अपवोट करने पर विचार करें (अन्यथा यदि अन्य नोजर क्लोज़-ऑल-द-द-डाउन डाउनवोटर्स बैंडवागन पर कूदते हैं तो इसे हटाने का जोखिम हो सकता है)।
sideshowbarker

1
उद्देश्य पर पैटर्न धीमा है। इसके बजाय अधिक प्रभावी तरीका लुकहेड्स को छोड़ना और इसके बजाय रीफ़रेंस एरे का उपयोग करना है। लेकिन यह सवाल वास्तव में इष्टतम कोड लिखने के बारे में नहीं है।
टॉम ज़ातो -

जवाबों:


2

परीक्षणों की एक श्रृंखला के बाद, मैंने पुष्टि की कि यह एक मोज़िला फ़ायरफ़ॉक्स मुद्दा है (यह मेरे द्वारा कोशिश की गई सभी विंडोज़ डेस्कटॉप संस्करणों को प्रभावित करता है)। Google Chrome, Opera, या यहां तक ​​कि फ़ायरफ़ॉक्स मोबाइल के साथ, regexp मैच उसी के बारे में, कार्यकर्ता या नहीं लेते हैं।

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.