JavaScript中licz()函数执行时间测量异常问题排查
问题分析与解决方案
嘿,我完全懂你的烦恼——用window.performance.now()测量licz()的执行时间时,不管数组大小怎么调,结果总是0或1毫秒,这根本没法用来做性能对比图表对吧?咱们来拆解问题,搞定它:
为什么会出现这种情况?
你的licz()函数基于二分查找实现,时间复杂度是O(log n)——哪怕数组是10000个元素,log2(10000)也才约14次比较操作。浏览器的JS引擎(比如Chrome的V8)执行这些步骤只需要几微秒,而window.performance.now()虽然能精确到微秒级别,但当你输出结果时,通常会被四舍五入到毫秒,所以就显示成0或1ms了。单次执行的速度实在太快,超出了肉眼能看到的差异范围。
解决办法:多次重复执行取平均值
要得到有统计意义的时间数据,你需要把licz()的调用重复很多次,用总耗时除以执行次数得到平均时间。这样就能放大时间差异,不同数组大小的性能区别就会显现出来。
修改你的时间测量代码如下:
// 函数调用部分 w = 49; // 查找的数值 n = tab.length; // 数组长度 const iterations = 10000; // 重复执行的次数,可根据需要调整 let sum = 0; // 用来存储返回值,避免浏览器优化 var start = window.performance.now(); for(let i = 0; i < iterations; i++){ ilosc = licz(tab, w, n); sum += ilosc; // 强制使用返回值,防止JS引擎优化掉函数调用 } var end = window.performance.now(); var averageTime = (end - start) / iterations; console.log(`Average time per execution: ${averageTime} ms`); console.log(`Total occurrences summed: ${sum}`); // 验证执行次数
额外注意事项
- 调整迭代次数:如果数组很大(比如百万级),可以适当减少迭代次数;如果数组较小,就增加次数,保证总耗时在几十到几百毫秒之间,这样计算出的平均值更准确。
- 避免浏览器优化:一定要使用函数的返回值(比如上面的
sum += ilosc),否则JS引擎可能会判断函数调用没有副作用,直接跳过执行,导致时间测量完全不准。 - 测试环境一致:测试时尽量关闭浏览器的其他标签页、插件,避免其他进程干扰性能测量结果。
这样修改后,你就能得到不同数组大小下licz()的平均执行时间,用来制作时间与数组大小的关系图表就没问题啦。
内容的提问来源于stack exchange,提问作者Constant
相关产品推荐
相关产品推荐

