2010-04-20 8 views
6

मैं "कैशिंग" गणित के लाभ/हानि को बेंचमार्क करने की कोशिश कर रहा था, उम्मीद है कि मैं तेजी से कॉल कर सकता हूं।स्थानीय वैरिएबल वैश्विक चर से एक्सेस करने के लिए 7x लंबा लेते हैं?

<html> 
<head> 
<script> 
window.onload = function() 
{ 
    var startTime = new Date().getTime(); 
    var k = 0; 
    for(var i = 0; i < 1000000; i++) k += Math.floor(9.99); 
    var mathFloorTime = new Date().getTime() - startTime; 

    startTime = new Date().getTime(); 
    window.mfloor = Math.floor; 
    k = 0; 
    for(var i = 0; i < 1000000; i++) k += window.mfloor(9.99); 
    var globalFloorTime = new Date().getTime() - startTime; 

    startTime = new Date().getTime(); 
    var mfloor = Math.floor; 
    k = 0; 
    for(var i = 0; i < 1000000; i++) k += mfloor(9.99); 
    var localFloorTime = new Date().getTime() - startTime; 

    document.getElementById("MathResult").innerHTML = mathFloorTime; 
    document.getElementById("globalResult").innerHTML = globalFloorTime; 
    document.getElementById("localResult").innerHTML = localFloorTime; 
}; 
</script> 
</head> 
<body> 
Math.floor: <span id="MathResult"></span>ms <br /> 
var mathfloor: <span id="globalResult"></span>ms <br /> 
window.mathfloor: <span id="localResult"></span>ms <br /> 
</body> 
</html> 

मेरा परीक्षण से परिणाम:

यहाँ परीक्षण किया गया था

[Chromium 5.0.308.0]: 
Math.floor: 49ms 
var mathfloor: 271ms 
window.mathfloor: 40ms 

[IE 8.0.6001.18702] 
Math.floor: 703ms 
var mathfloor: 9890ms [LOL!] 
window.mathfloor: 375ms 

[Firefox [Minefield] 3.7a4pre] 
Math.floor: 42ms 
var mathfloor: 2257ms 
window.mathfloor: 60ms 

[Safari 4.0.4[531.21.10] ] 
Math.floor: 92ms 
var mathfloor: 289ms 
window.mathfloor: 90ms 

[Opera 10.10 build 1893] 
Math.floor: 500ms 
var mathfloor: 843ms 
window.mathfloor: 360ms 

[Konqueror 4.3.90 [KDE 4.3.90 [KDE 4.4 RC1]]] 
Math.floor: 453ms 
var mathfloor: 563ms 
window.mathfloor: 312ms 

विचरण, यादृच्छिक ज़ाहिर है, है, लेकिन सबसे अधिक भाग के

सभी मामलों में [के लिए इस समय ले लिया पता चलता]:
[लेता है लंबे समय तक] mathfloor> Math.floor> window.mathfloor [है तेजी से]

यह क्यों है? अपनी परियोजनाओं में मैं var mfloor = Math.floor उपयोग कर रहे हैं, और मेरे नहीं-तो-अद्भुत मानक के अनुसार, "अनुकूलन" करने के लिए अपने प्रयासों को वास्तव में नीचे स्क्रिप्ट एक बहुत से धीमा ...

मेरे कोड बनाने के लिए किसी भी अन्य रास्ता नहीं है अधिक कुशल"...? मैं मंच जहां मैं मूल रूप से अनुकूलन करने के लिए की जरूरत में हूँ, इसलिए कोई, इस "समय से पहले अनुकूलन" नहीं है ...

+0

मैं यह गलत पढ़ रहा हो सकता है, लेकिन अपने पाठ लेबल लगता है कि वे गलत चीजों का जिक्र कर रहे हैं। ऐसा लगता है कि वे किया जाना चाहिए: Math.floor: एमएस
window.mathfloor: एमएस
वर mathfloor: एमएस
Joe

उत्तर

2

आप इन दो चर गलत रूप से लेबल है:

var mathfloor: <span id="globalResult"></span>ms <br /> 
window.mathfloor: <span id="localResult"></span>ms <br /> 

@ डेविड के विकल्प के कुछ प्रकार होगा के रूप में, में देख लायक हैं memoisation।

+0

मुझे अब बेवकूफ लगता है। धन्यवाद। क्या आप समझा सकते हैं कि Window.mathfloor हमेशा क्यों लेता है लेकिन Window.Math.floor नहीं करता है? – Warty

+1

मुझे लगता है कि ऐसा इसलिए है क्योंकि विंडो ऑब्जेक्ट पर उनके लुकअप में ग्लोबल्स को विशेषाधिकार प्राप्त है; आप उनके लिए अनुकूलित कर सकते हैं। यह पृष्ठ http://www.webreference.com/programming/javascript/jkm3/ अपने निष्कर्षों की पुष्टि करता है और क्योंकि खिड़की वस्तु समय की सबसे अच्छे रूप में भीड़ यह पता चलता है। – wombleton

0

क्यों आपके मानदंड है कि वे क्या करते हैं मुझे यकीन है कि नहीं हूँ।

लेकिन अगर आप Math.floor कॉल करने के लिए जा रहे हैं अक्सर आप इसका उपयोग कर सकते हैं:

var num = 9.99; 
var floored = ~~num; // 9 

ऐसा नहीं है कि ~~ शायद नकारात्मक संख्या 32 बिट सीमा से बाहर संख्या तारों पर विफल हो जाएगा (var num = "9.99"), और (~~ राउंड अप होगा)।

एक छोटे से अधिक जानकारी के लिए this question देखें।


अद्यतन
यहाँ एक modified benchmark

क्रोम पर मैं स्थानीय तेजी Math.floor और वैश्विक क्षेत्र से लौटने गुंजाइश हो रही है। (window.mfloor) ध्यान दें कि मैं वैश्विक बफमार्क में window. वाक्यविन्यास के साथ वैश्विक mfloor का संदर्भ नहीं दे रहा हूं।

तो, मुझे लगता है कि अपने परीक्षण 2 मुद्दों (चर नाम मिश्रण अन्य उत्तर में वर्णित के अलावा) है। एक यह है कि आप window.mfloor पर लूप चला रहे थे और दूसरी बात यह है कि आपके पास एक स्थानीय वैरिएबल था जो वैश्विक वैरिएबल के समान नाम था (यह सिर्फ अटकलें है)।

jsbin लिंक मैं पोस्ट का उपयोग कर बेंचमार्क की कोशिश करो और मेरे पास वापस मिलता है।


यहाँ आलसी के लिए मेरे बेंचमार्क है:

window.onload = function(){ 

    var k = 0, i=0, n = 2000000, 
    startTime = +(new Date); 
    for(; i < n; ++i) k += Math.floor(9.99); 
    var mathFloorTime = (new Date) - startTime; 

    window.globalMfloor = Math.floor; 
    k = i = 0; 
    startTime = +(new Date); 
    for(; i < n; ++i) k += globalMfloor(9.99); 
    var globalFloorTime = (new Date) - startTime; 

    var mfloor = Math.floor; 
    k = i = 0; 
    startTime = +(new Date); 
    for(; i < n; ++i) k += mfloor(9.99); 
    var localFloorTime = (new Date) - startTime; 

    alert("Math.floor: " + mathFloorTime); 
    alert("globalMfloor: " + globalFloorTime); 
    alert("mfloor: " + localFloorTime); 
};​ 
+0

मेरा प्रश्न में सामान्य से अधिक होने के लिए लक्षित किया गया था। जैसा कि: स्थानीय चरों का उपयोग हमेशा के लिए क्यों होता है =/Math.floor केवल एक उदाहरण था। थॉमस फुच्स उसके अनुकूलन व्याख्यान में से एक में ~~ बात प्रस्तुत किया, और हाँ, यह समय बहुत कटौती करता है, लेकिन है कि मैं क्या – Warty

+0

ठीक के लिए पूछ रहा हूँ नहीं है, मैं सिर्फ यह सिर्फ मामले में उल्लेख करना चाहता था। मैं आपके प्रश्न के बारे में उत्सुक हूं और अपने आप पर कुछ मानक कर रहा हूं। अगर मुझे ब्याज की कोई चीज़ मिलती है तो मैं अपना जवाब अपडेट करूंगा। –

0

संपादित करें: ओह, मैंने फ़ील्ड नाम मिश्रण के बारे में जवाब नहीं पढ़ा। ऐसा लगता है कि, Firefox में, एक स्थानीय चर तक पहुँचने तेज थी Math.floor तक पहुँचने, लेकिन तक पहुँचने एक वैश्विक चर के रूप में लंबे समय से 140% ले लिया के रूप में (80% के रूप में समय लगा)।

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

+0

वैश्विक चर से पहले फ़ंक्शन स्थानीय चर खोजे जाते हैं। – wombleton

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