JavaScript中的奇怪性能行为

时间:2016-05-07 19:30:16

标签: javascript performance google-chrome

我试图评估一些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倍。它必须是一个符号,一个字符串无济于事。

有人能告诉我这里发生了什么吗?

0 个答案:

没有答案
相关问题