我想用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函数执行每个循环。
答案 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