2011-12-28 17 views
34

फ़ायरफ़ॉक्स 9.0.1 ने एन Ω (एन) लूप विधि के साथ अपना Ω (लॉग एन) संख्या-पैडिंग एल्गोरिदम दिखाकर मुझे आश्चर्यचकित कर दिया जब एन छोटा है। In every other browser I've seen, the loop is slower, यहां तक ​​कि एन के छोटे मूल्यों के लिए भी। मुझे पता है कि सभी ब्राउज़र जेएस को अनुकूलित करने पर काम कर रहे हैं, लेकिन चूंकि अन्य सभी, आधुनिक ब्राउज़र लूप को धीमे होने के लिए दिखा रहे हैं, क्या फ़ायरफ़ॉक्स 9 में व्यवहार के लिए कोई स्पष्टीकरण है?फ़ायरफ़ॉक्स ने इस लूप को कैसे अनुकूलित किया?

// Ω(log n) 
function padNumberMath(number, length) { 
    var N = Math.pow(10, length); 
    return number < N ? ("" + (N + number)).slice(1) : "" + number 
} 

// Ω(n): 
function padNumberLoop(number, length) { 
    var my_string = '' + number; 
    while (my_string.length < length) { 
     my_string = '0' + my_string; 
    } 
    return my_string; 
} 

अद्यतन: मुझे नहीं लगता कि इस मूल प्रश्न से संबंधित है, लेकिन मैं अभी पता चला कि आईई 9 जब 64-बिट मोड के लिए 32- से स्विच व्यवहार स्विच करता है। 32-बिट मोड में, मैथ विधि जीत जाती है। 64-बिट मोड में, लूप विधि जीत जाती है। बस सोचा कि मुझे इसे इंगित करना चाहिए।

अपडेट 2: एमएके ने मुझे नीचे अपनी टिप्पणी में पकड़ा। गणित विधि Ω (1) नहीं है, यह शायद Ω (लॉग एन) की तरह अधिक है।

+5

कौन सा Ω (1) विधि है? मुझे किसी भी एक्सपोनिएशन एल्गोरिदम की जानकारी नहीं है जो ओ (लॉग एन) से तेज है। – MAK

+0

यहां कुंजी यह है कि यह केवल n के छोटे मानों के लिए होती है। मैं मानता हूं कि कुछ प्रकार का लूप-अनोलिंग होता है जब एन छोटा होता है, जिससे ओ (1) परिणाम होता है। यदि वे एक लूप में स्ट्रिंग कॉन्सटेनेशन को और अनुकूलित करते हैं, तो यह भी तेज हो सकता है। कोड को देखकर केवल सही जवाब मिलेगा, हालांकि। – jknupp

+0

आप मान लेंगे, लेकिन क्या आप * शो * को कोई सबूत प्रदान कर सकते हैं कि लूप अनोलिंग चल रहा है? –

उत्तर

11

the results इसकी बहुत स्पष्ट को देखते हुए कि फ़ायरफ़ॉक्स कुछ भी नहीं किया एक प्रदर्शन लाभ प्राप्त करने के लिए।

browserscope

इन सलाखों "गति" (संचालन/सेकंड) तो बड़ा सलाखों बेहतर हैं के रूप में पढ़ा जा सकता है। सब कुछ स्केल करना है।

फ़ायरफ़ॉक्स 9 में, यह बहुत स्पष्ट है कि "गणित" विधि अबाध रूप से निष्पादित करती है, जबकि संस्करणों के बीच "लूप" विधि में थोड़ा बदलाव होता है।

तो वहाँ था कोईफ़ायरफ़ॉक्स 9. सभी में किसी भी प्रकार का है कि इन परीक्षणों के संबंध में फ़ायरफ़ॉक्स 8 और 9 के बीच हुआ "अनुकूलन" किसी तरह अपने गणित पुस्तकालय मिल धीमी (Math.pow धीमी गति से किया जा रहा है) है, या उनके स्ट्रिंग लाइब्रेरी धीमी हो गई (.slice() धीमी हो रही है)।

आगे इस में देख रहे हैं, यह स्पष्ट somehow these elementary operations got a bit slower in ff9 है:

ff8 vs ff9

दोनों संयोजन और Math.pow जो अंतर आप में देख प्रमुख कारण हो सकता एफएफ 8 में से एफएफ 9 में थोड़ा धीमा कर रहे हैं, अपने परीक्षण।

दिलचस्प, नया नो-ऑप बार एफएफ 9 की तुलना में एफएफ 8 में काफी लंबा है।

+0

वाह, ऐसा लगता है कि एक बग खोला जाना चाहिए? मैंने फ़ायरफ़ॉक्स 9 पर अपने कुछ कोड को बेंचमार्क किया था और ऐसा लगता है कि टाइप इनफरेंस से 30% सुधार का दावा है कि उनका दावा काफी हद तक सटीक है ... लेकिन मेरा कोड गणित-भारी नहीं है –

+2

खोला [एक बग] (https: //bugzilla.mozilla .org/show_bug.cgi? id = 713875) – kojiro

+1

शानदार उत्तर। :) –

0

फ़ायरफ़ॉक्स 9.0.1 ने एन Ω (एन) संख्या-पैडिंग एल्गोरिदम को Ω (एन) लूप विधि के साथ दिखाकर मुझे आश्चर्यचकित कर दिया जब एन छोटा है।

क्या यह वाक्य कुछ हिस्सों को याद नहीं कर रहा है? यह के रूप में दिखाई दे रहा था, या कुछ? और आप खाली String से Number एस क्यों जोड़ रहे हैं? क्यों न केवल String बनाएं?

और हाँ, अपने हे (1) वास्तव में ओ (लॉग इन करें) है ...

फिर भी, स्पष्टीकरण के रूप में तेजी से शायद Firefox 9 में Type Inference को

+1

"दिखा रहा है" का मेरा पहला प्रभाव "बेहतर से बेहतर" हो सकता है, जैसा कि मैंने "9 अंक बनाए हैं, लेकिन पीटर वर्गा ने मुझे 11 अंक स्कोर करके दिखाया"। यकीन नहीं है कि ओपी का मतलब क्या है, लेकिन इस तरह मैंने इसका अर्थ लिया। –

+3

"दिखाना" का उपयोग यहां "प्रकट" से अलग अर्थ में किया जाता है। वह "बेहतर साबित करने" के लिए "दिखाने के लिए" नियोजित कर रहा है। http://idioms.thefreedictionary.com/show+up – jela

+0

@ जेला दरअसल, इस तरह मेरा मतलब था। – kojiro

3

यह हो सकता है की वजह से है एक पैरामीटर arraycopying एक नई चार सरणी में स्ट्रिंग, जो शायद डिफ़ॉल्ट रूप से एक प्रासंगिक चरित्र के लिए शुरू की जाती है, इस मामले में एक संख्या।

शायद रिकर्सिव असाइनमेंट को पहचानने के बारे में कुछ जो निरंतर शामिल है, लंबाई-mystring.length + 1 '0 की mystring के साथ एक स्ट्रिंग के त्वरित संयोजन को अनुमति देता है।

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

संबंधित मुद्दे