30秒速答:
返回目标函数
每秒执行次数。
通过获取循环
前后的毫秒数差,将毫秒
转换为秒
,以计算循环消耗的时间
。
循环次数
除以循环消耗的时间
,可以得到每秒循环次数
。
默认的循环次数
为100次
。
const hz = (fn, iterations = 100) => {
const before = performance.now();
for (let i = 0; i < iterations; i++) {
fn();
}
const after = performance.now();
const time2use = (after - before) / 1000;
return iterations / time2use;
};
通过hz
比较循环
与reduce
的执行速度。
// 创建10000长度递增的数字数组
const numbers = Array(10000)
.fill()
.map((_, i) => i);
// reduce的方式计算数字相加
const sumReduce = () => numbers.reduce(
(acc, n) => acc + n, 0
);
// 循环的方式计算数字相加
const sumForLoop = () => {
let sum = 0;
for (let i = 0; i < numbers.length; i++) {
sum += numbers[i];
}
return sum;
};
// 循环大概比reduce快5倍
// 6202
Math.round(hz(sumReduce));
// 32733
Math.round(hz(sumForLoop));
hz
(赫兹)是国际单位制中频率的单位,用于计量每秒钟的周期性变动重复次数。
该方法返回一个精确到毫秒的时间戳
。
与Date.now
不同的是,performance.now
返回的时间戳
没有被限制在一毫秒的精确度内,他使用浮点数
来达到微秒级别
的精度。
另外一个不同点是,performance.now
是以一个恒定的速率慢慢增加的,不受系统时间的影响(可能被其他软件调整)。
performance.timing.navigationStart
+ performance.now()
约等于 Date.now()
。