2011-07-05 9 views
9

में चलते समय जावास्क्रिप्ट प्रदर्शन ऐसा लगता है कि क्रोम और फ़ायरफ़ॉक्स * के कुछ हालिया संस्करण में कोई बदलाव आया है, और अब जावास्क्रिप्ट निष्पादन अलग-अलग प्रतीत होता है जब टैब चालू हो रहा है, वर्तमान में केंद्रित नहीं है एक।एक फ़ोकस किए गए टैब

जब मैं अपना जावास्क्रिप्ट यूनिट परीक्षण चलाता हूं, तो उन्हें सामान्य रूप से पूरा करने में लगभग 20 सेकंड लगते हैं लेकिन अब, जब टैब फ़ोकस किया जाता है, तो यह 2000 सेकंड के ऊपर ले जाता है। हालांकि अजीब बात यह है कि प्रत्येक व्यक्तिगत परीक्षण के लिए रन टाइम प्रभावित नहीं होते हैं (अधिकांश अभी भी < 10ms हैं)। मैं जिस परीक्षण धावक का उपयोग कर रहा हूं, वह प्रत्येक परीक्षण को चलाने के बीच setTimeout(0) जोड़ता है ताकि ब्राउज़र निष्पादित करते समय लॉक न हो, और ऐसा लगता है कि संभावित अपराधी लगता है।

क्या जावास्क्रिप्ट इंजन को यह बताने का कोई तरीका है कि उस टैब को "वंचित" न करें? मुझे अपने आप को देखने के बिना पृष्ठभूमि में अपने परीक्षण चलाने में सक्षम होना अच्छा लगता है ...

* क्षमा करें, मुझे वास्तव में पुराने संस्करणों को स्थापित करने का प्रयास करने के लिए पर्याप्त परवाह नहीं है जब यह शुरू हो रहा है। कम से कम, यह फ़ायरफ़ॉक्स 5.0 और क्रोम 12.

उत्तर

9

setTimeout और setInterval पर अब हो रहा है विकेन्द्रित टैब में 1000ms की एक न्यूनतम करने के लिए रोक दिए गए हैं। Here बगजिला रिपोर्ट है जो इसका उल्लेख करती है। और यहां समान Chromium bug report है। मेरा मानना ​​है कि इस अनुसार MDN के बाद से संस्करण 11.

फ़ायरफ़ॉक्स 5 में और क्रोम में मामला है:

में (फ़ायरफ़ॉक्स 5.0/थंडरबर्ड 5.0) और क्रोम 11, समय समाप्ति फायरिंग लिए क्लैम्प किया जाता नहीं निष्क्रिय टैब में सेकंड (1000ms) प्रति बार एक से अधिक बार; क्रोम में इस बारे में जानकारी के लिए मोज़िला में इस बारे में अधिक जानकारी या crbug.com/66078 के लिए बग 633,421 देखते हैं।

इस प्रतिबंध के आसपास प्राप्त करने के लिए के रूप में, आप तकनीक this article में चर्चा की कोशिश कर सकते हैं, लेकिन मैं इसे अपने आप अभी तक कोशिश करने के लिए एक बदलाव नहीं किया है।

+0

और: लागू करने के लिए एक 0 एमएस एक आधुनिक ब्राउज़र में समय-समाप्त आप उपयोग कर सकते हैं 'window.postMessage()' https: //developer.mozilla। org/en/डोम/खिड़की।setTimeout – James

+0

@ जेम्स - आपने अपनी टिप्पणी पोस्ट की है जैसा कि मैंने उस पृष्ठ द्वारा संदर्भित आलेख के साथ अपना उत्तर अपडेट किया है :) –

+0

ग्रेट दिमाग एक जैसे सोचते हैं ... और एक ही नाम है! :) – James

2

परिवर्तन किया (एक बहुत द्वारा) बढ़ाने के लिए कम से कम टाइमआउट मान था। मेरे ज्ञान के लिए इसे नियंत्रित करने का कोई तरीका नहीं है; यह टाइमर कार्यान्वयन के अंदरूनी हिस्सों में है। क्रोम और फ़ायरफ़ॉक्स दोनों अब यह करते हैं, शायद सफारी भी।

यदि आप का उपयोग बहुत अजीब हो जाता है "setInterval()", क्योंकि ऐसा लगता है कि ब्राउज़र कि अंतराल कॉलबैक समय की उचित संख्या कहा जाता हो जाता है सुनिश्चित करने के लिए चाहता है। जब आप पृष्ठ पर लौटने के लिए, आप अंतराल टाइमर से गतिविधि का एक फट पाने के रूप में वे पकड़ने।

5

विशेष रूप से Firefox के लिए, आप प्रोफ़ाइल है कि आप परीक्षण चलाने के लिए उपयोग करने में अपनी पसंद के एक नंबर करने के लिए about:config में dom.min_background_timeout_value प्राथमिकता बदल सकते हैं। मैं अपने डिफ़ॉल्ट ब्राउज़िंग प्रोफ़ाइल में कर रही सुझाव है कि नहीं है, हालांकि: उच्च क्लैंप के लिए कारण यह है कि यह सीपीयू चबाने मूर्खतापूर्ण टिकर और पसंद को अद्यतन करने पृष्ठभूमि टैब में वेब साइटों पर कटौती है।

0

मैं कई setInterval() का उपयोग कर यह वैकल्पिक हल कर सकते हैं:

var setRealInterval = function(callback, interval) { 
    var minBrowserInterval = 1000 
    var setIntervalsCount = Math.max(1, minBrowserInterval/interval) 
    for (var i = 0; i < setIntervalsCount; i++) { 
     ;(function(i) { 
      setTimeout(function() { 
       setInterval(callback, interval * setIntervalsCount) 
      }, i * interval) 
     })(i) 
    } 
} 
संबंधित मुद्दे