使用Js计算函数平均运行时间

时间:2014-03-25 01:50:00

标签: javascript

我想用J来计算我的函数的运行时间,但似乎只是第一次时间间隔不为零。

var i = 0;
//var timeArray = new Array();
//var date1;
//var date2;
var time = 0;
while(i < 5) {
    var date1 = new Date();
    var date2 = new Date();
    var t = decide_class(attr[i]);
    time += (date2.getTime() - date1.getTime());
    i++;
}

attr是二维数组,我确信decision_class函数执行每个循环。

5 个答案:

答案 0 :(得分:1)

您需要使用高精度计时器。以下不完全是我的代码。

window["performance"] = window.performance || {};
performance.now = (function() {
    return performance.now    ||
    performance.webkitNow     ||
    performance.msNow         ||
    performance.oNow          ||
    performance.mozNow        ||
    function() { return new Date().getTime(); };
})();

而不是使用date.getTime()只需使用performance.now();

答案 1 :(得分:0)

如果您需要比日期(毫秒)更准确的内容并且您使用的是现代浏览器,则可以尝试Performance.now()https://developer.mozilla.org/en-US/docs/Web/API/Performance.now()

浏览器:http://caniuse.com/#feat=high-resolution-time

  

与JavaScript可用的其他计时数据不同(例如   Date.now),Performance.now()返回的时间戳不是   限于1毫秒的分辨率。相反,它们代表了时代   作为具有高达微秒精度的浮点数。

答案 2 :(得分:0)

尝试使用新的Date.getTime()而不是仅使用Date()。 Date.getTime()返回自1970年1月1日午夜以来的毫秒数。 此外,我没有看到在循环中获取新的Date对象的重点,除非您有相同的具体原因。 为什么不在循环条目之前调用Date.getTime()然后在循环退出之后再次调用,并找出差异来计算n次调用函数需要多长时间? (如果我错过了在循环中执行此操作的原因,我道歉。)

答案 3 :(得分:0)

计算所有循环怎么样?

var i = 0;
//var timeArray = new Array();
//var date1;
//var date2;
var date1 = Date.now();
alert(date1)
while(i < 5) {    
    var t = decide_class(attr[i]);   
    i++;
}
var date2 = Date.now();
var time = (date2-date1);

如果方法decision_class太快,这可能有助于消除一些不精确性。如果即使这样,你得到一个0值的时间,尝试评估你的decision_class函数是否太快。尝试类似JavaScript sleep/wait before continuing之类的内容,并评估及时返回的值。

答案 4 :(得分:0)

两年后,您的浏览器很可能支持performance.now()。要回答手头的问题,如何计算函数或代码片段执行所需的平均时间,我在没有jsPerf时所做的是创建一个包含我想要的各个测试的测试对象测量。然后我运行每次测试11次,记录最后10次测量(第一次测试运行起到预热作用,因为我注意到它的时间通常偏高)。最后,我除以10得到平均时间。

以下是代码:

public SomeClass()
{
    //initialize members;
}
// Test setup (code shared by all tests)
var date = new Date()

function startTests() {
  var sOutput = '';
  
  // Define tests
  var oTestSuite = {
    'toString': function(bWarmup) {
      return doTest(function() {
        // Insert code to test below
        // ******************************************************************
        date.toString().split(' ');
        // ******************************************************************
        // End code block
      });
    },
    'concatenate': function(bWarmup) {
      return doTest(function() {
        // Insert code to test below
        // ******************************************************************
        (''+date).split(' ');
        // ******************************************************************
        // End code block
      });
    }
  };

  for (test in oTestSuite) {
    var nTestCount = 10,
      sTotalTime = test + 'Total';
    sOutput += 'Start timing \'' + test + '\' method...\n';
    oTestSuite[sTotalTime] = 0;
    oTestSuite[test](); // Warmup
    for (var i=0; i<nTestCount; ++i) {
      var nTime = oTestSuite[test]();
      oTestSuite[sTotalTime] += nTime;
      sOutput += 'Took: ' + nTime + ' ms\n';
    }
    sOutput += test + ' AVERAGE: ' + (oTestSuite[sTotalTime]/nTestCount) +
      '\n#################################################################\n';
  }
  
  document.getElementById('output').value = sOutput;
}

function doTest(fn) {
  var nStart = performance.now();
  for (var i=0, imax=100000; i<imax; ++i) {
    fn();
  }
  var nStop = performance.now(),
    nTime = nStop-nStart;
  return nTime;
}

以下是比较Chrome v50(64位)中两种字符串转换技术的结果:

<textarea id="output" cols="80" rows="26"></textarea><br>
<button id="btn" onclick="startTests()">Start Tests</button>

您也可以在此笔中使用它:http://codepen.io/thdoan/pen/aNKJbQ