对代码进行基准测试 - 测量执行时间
大多数性能提示非常依赖于 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