對程式碼進行基準測試 - 測量執行時間
大多數效能提示非常依賴於 JS 引擎的當前狀態,並且預計僅在給定時間相關。效能優化的基本規律是,你必須首先在嘗試優化之前進行測量,然後在假定的優化之後再次進行測量。
要測量程式碼執行時間,你可以使用不同的時間測量工具,例如:
效能介面,表示給定頁面的與時序相關的效能資訊(僅在瀏覽器中可用)。
Node.js 上的 process.hrtime 為你提供[秒,納秒]元組的計時資訊。在沒有引數的情況下呼叫它返回一個任意時間但是使用先前返回的值作為引數呼叫它返回兩次執行之間的差異。
控制檯計時器 console.time("labelName")
啟動一個計時器,你可以使用該計時器跟蹤操作所需的時間。你為每個計時器指定一個唯一的標籤名稱,並且在給定頁面上最多可以執行 10,000 個計時器。當你使用相同的名稱呼叫 console.timeEnd("labelName")
時,瀏覽器將完成給定名稱的計時器並輸出自計時器啟動以來經過的時間(以毫秒為單位)。傳遞給 time()
和 timeEnd()的字串必須匹配,否則計時器將無法完成。
Date.now 函式 Date.now()
以毫秒為單位返回當前時間戳 ,這是自 1970 年 1 月 1 日 00:00:00 UTC 到現在的時間的數字表示。方法 now()
是 Date 的靜態方法,因此你始終將其用作 Date.now()
。
實施例 1 使用:performance.now()
在這個例子中,我們將計算執行函式所用的時間,我們將使用 Performance.now()
方法返回一個以毫秒為單位的 DOMHighResTimeStamp ,精確到千分之一毫秒。
let startTime, endTime;
function myFunction() {
//Slow code you want to measure
}
//Get the start time
startTime = performance.now();
//Call the time-consuming function
myFunction();
//Get the end time
endTime = performance.now();
//The difference is how many milliseconds it took to call myFunction()
console.debug('Elapsed time:', (endTime - startTime));
控制檯中的結果將如下所示:
Elapsed time: 0.10000000009313226
performance.now()
的使用在瀏覽器中具有最高精度,精度為千分之一毫秒,但相容性最低。
實施例 2 使用:Date.now()
在這個例子中,我們將計算一個大陣列初始化的經過時間(100 萬個值),我們將使用 Date.now()
方法
let t0 = Date.now(); //stores current Timestamp in milliseconds since 1 January 1970 00:00:00 UTC
let arr = []; //store empty array
for (let i = 0; i < 1000000; i++) { //1 million iterations
arr.push(i); //push current i value
}
console.log(Date.now() - t0); //print elapsed time between stored t0 and now
例 3 使用:console.time("label")
&console.timeEnd("label")
在這個例子中,我們正在執行與例 2 中相同的任務,但我們將使用 console.time("label")
和 console.timeEnd("label")
方法
console.time("t"); //start new timer for label name: "t"
let arr = []; //store empty array
for(let i = 0; i < 1000000; i++) { //1 million iterations
arr.push(i); //push current i value
}
console.timeEnd("t"); //stop the timer for label name: "t" and print elapsed time
例 4 使用 process.hrtime()
在 Node.js 程式中,這是測量花費時間的最精確方法。
let start = process.hrtime();
// long execution here, maybe asynchronous
let diff = process.hrtime(start);
// returns for example [ 1, 2325 ]
console.log(`Operation took ${diff[0] * 1e9 + diff[1]} nanoseconds`);
// logs: Operation took 1000002325 nanoseconds