2014-03-25 85 views
0

我想使用Js來計算我的函數的運行時間,但它似乎只是第一次時間間隔不爲零。使用Js來計算函數平均運行時間

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

我懷疑'Date'對象*是*準確的。如何衡量最後一次總時間? –

+1

您需要在調用decide_class之後實例化date2,而不是之前。 – Donal

回答

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返回的時間戳是不 限於一毫秒的分辨率。相反,它們將時間 表示爲具有高達微秒精度的浮點數。

+0

的結果仍然是一樣的。我想也許在第一次循環後,優化功能,使運行時間大大減少。我嘗試循環大約10萬次,並記錄while循環的時間,它總共花費4秒。 – Smilecrazy

+0

在這種情況下,你也知道循環中函數的平均運行時間是4/100000秒。爲什麼要在while循環中計算它* – Jorg

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();

+0

道歉,高分辨率定時器* – Hedzer

0

嘗試使用新的Date.getTime()而不是僅使用Date()。 Date.getTime()返回自1970年1月1日午夜以來的毫秒數。 此外,我沒有看到在循環中獲取新的Date對象的要點,除非您有相同的具體原因。 爲什麼不直接在循環入口之前調用Date.getTime(),然後在循環退出之後再次調用Date.getTime(),並找出差異來計算n次函數調用需要多長時間? (如果我錯過了循環中的原因,我很抱歉)。

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並評估及時返回的值。

0

兩年後,您的瀏覽器很可能支持performance.now()。爲了回答這個問題,如何計算一個函數或代碼片段執行所花費的平均時間,我在沒有jsPerf時所做的工作就是創建一個包含我想測量的單個測試的測試對象。然後我運行每次測試11次,記錄最後10次測量結果(第一次測試運行起熱身作用,因爲我注意到它的時間通常偏高)。最後,我除以10得到平均時間。

下面的代碼:

// 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; 
 
}
<textarea id="output" cols="80" rows="26"></textarea><br> 
 
<button id="btn" onclick="startTests()">Start Tests</button>

這裏是比較在我的Chrome V50兩個String轉換技術的結果(64位):

Start timing 'toString' method... 
Took: 204.59500000000003 ms 
Took: 210.59000000000003 ms 
Took: 205.95500000000004 ms 
Took: 206.57000000000005 ms 
Took: 204.07500000000005 ms 
Took: 205.11000000000013 ms 
Took: 203.99500000000012 ms 
Took: 213.87500000000023 ms 
Took: 222.48499999999967 ms 
Took: 206.39499999999998 ms 
toString AVERAGE: 208.36450000000005 
################################################################# 
Start timing 'concatenate' method... 
Took: 286.18499999999995 ms 
Took: 283.6400000000003 ms 
Took: 284.8199999999997 ms 
Took: 278.5100000000002 ms 
Took: 283.0750000000003 ms 
Took: 282.5049999999992 ms 
Took: 281.3750000000009 ms 
Took: 286.59000000000106 ms 
Took: 281.3150000000005 ms 
Took: 284.09500000000025 ms 
concatenate AVERAGE: 283.21100000000024 
################################################################# 

你也可以在這支筆中玩弄它:http://codepen.io/thdoan/pen/aNKJbQ