这段代码的在线演示如下所示:
记住这个示例后,让我们开端下面的评论辩论。
缺点1 – 不测衡量不重要的工作
在膳绫擎的示例中,你可以留意到,我们在两次调用performance.now()中心只调用了makeHash()函数,然后将它的值赋给result变量。这给我们供给了函数的履行时光,而没有其他的干扰。我们也可以按照下面的方法来衡量代码的效力:
- var t0 = performance.now();
- console.log(makeHash('Peter')); // bad idea!
- var t1 = performance.now();
- console.log('Took', (t1 - t0).toFixed(4), 'milliseconds');
这个代码片段的在线演示如下所示:
然则在这种情况下,我们将会测量调用makeHash(‘Peter’)函数花费的时光,以及将结不雅发送并打印到控制台上花费的时光。我们不知道这两个操作中每个操作具体花费若干时光, 肮脏道总的时光。并且,发送和打印输出的操作所花费的时光会依附于所用的浏览器,甚至依附于当时的高低文。
- var t0 = performance.now();
- var name = 'Peter';
- var result = makeHash(name.toLowerCase()).toString();
- var t1 = performance.now();
- console.log('Took', (t1 - t0).toFixed(4), 'milliseconds to generate:', result);
同样,我们不会知道履行时光是怎么分布的。它会是赋值操作、调用toLowerCase()函数或者toString()函数吗?
缺点 #2 – 只衡量一次
别的一个常见的缺点是只衡量一次,然后汇总花费的时光,并以此得出结论。很可能履行不合的次数会得出完全不合的结不雅。履行时光依附于很多身分:
- 编辑器热身的时光(例如,将代码编译成字节码的时光)
- 主线程可能正忙于其它一些我们没有意识到的工作
- 你的电脑的CPU可能正忙于一些会拖慢浏览器速度的工作
持续改进的办法是反复履行函数,就像如许:
- var t0 = performance.now();
- for (var i = 0; i < 10; i++) {
- makeHash('Peter');
- }
- var t1 = performance.now();
- console.log('Took', ((t1 - t0) / 10).toFixed(4), 'milliseconds to generate');
在这篇文┞仿中,我们会评论辩论若何衡量代码运行时光,以及有哪些技巧可以避免一些常见的“陷阱”。
这个示例的在线演示如下所示:
这种办法的风险在于我们的浏览器的JavaScript引擎可能会应用一些优化办法,这意味着当我们第二次调用函数时,如不雅输入时雷同的,那么JavaScript引擎可能会记住了第一次调用的输出,然后简单的返回这个输出。为懂得决这个问题,你可以应用很多不合的输入字符串,而不消反复的应用雷同的输入(例如‘Peter’)。显然,应用不合的输入进行测试带来的问题就是我们衡量的函数会花费不合的时光。或许个一一些输入会花费比其它输入更长的履行时光。
缺点 #3 – 太依附平均值
- Took 0.2730 milliseconds to generate: 77005292
- Took 0.0234 milliseconds to generate: 77005292
- Took 0.0200 milliseconds to generate: 77005292
推荐阅读
正则表达式是一种字符模式,用于在查找过程中匹配制订的字符。元字符平日在Linux平分为两类: Shell元字符,由Linux Shell进行解析; 正则表达式元字符,由vi/grep/sed/awk等文本处理>>>详细阅读
本文标题:测试JavaScript函数的性能
地址:http://www.17bianji.com/lsqh/36647.html
1/2 1