我试图评估一些JavaScript运行时行为,并陷入一种现象。它就在这个小提琴中:https://jsfiddle.net/Rolf_b/d23wq3hu/
它包含一些简单的HTML
<label for="loopCount">Test loops: </label>
<input id="loopCount" type="text" value="10000000" />
<input id="testbutton" type="button" value="Run Test" />
<p id="result">Choose Loop Count and click Run Test</p>
和我测试的一些JavaScript。我定义了一个构造函数,它创建了一些getter / setter属性,因为这就是我想要的基准。为了测量,我在我的测试按钮的点击事件上挂了一个函数,显示“正在运行”,让浏览器有机会显示它并继续一个简单的时间测量循环。
var MyClass = function() {
var aValue = 3;
//var sym = Symbol(); // Uncomment this to get BETTER TIMING. WTF?
//this[sym] = 123;
Object.defineProperties(this, {
myVal: { get: function() { return aValue; },
set: function(v) { aValue = v; } },
aCalc: { get: function() { return 2+3*aValue; } } } );
};
document.getElementById('testbutton').addEventListener('click', function() {
document.getElementById('result').innerText = "Running...";
setTimeout(function() {
var loopCount = parseInt(document.getElementById('loopCount').value);
var startTime = new Date(),
endTime,
i, j = 0,
c = new MyClass();
for (i = 0; i < loopCount; i++) {
j++;
if (c.aCalc != 11) alert('Wrong at ' + j);
}
endTime = new Date();
document.getElementById('result').innerText = 'Done, time was ' + (endTime-startTime) + ' ms, j='+ j;
}, 0);
});
问题:计时行为不一致。使用Chrome 50,第一次点击需要大约70毫秒,以下MOST点击高达1100毫秒。不是全部,也有一些在70ms完成。使用Chrome for Android,相同(只是速度较慢)。使用我平板电脑上的华硕浏览器:第一次点击约500ms,然后慢慢增加到600ms-700ms。然后,Internet Explorer 11(因为我是Win7男孩):首次点击330毫秒,下次点击大约250毫秒。
我可以理解第一次点击是否较慢。 JIT编译,有些东西是缓存的。但是Chrome?因素20到100?仅仅因为我使用了getter函数?为什么第一次通话很快,其余的很慢?
编辑May 09:如果取消注释MyClass构造函数中的两行,则时间会更好。第一个呼叫仍然很快,后续呼叫较慢,但它们比没有符号快9倍。它必须是一个符号,一个字符串无济于事。
有人能告诉我这里发生了什么吗?