Benchmark.js
性能测试工具
jsPerf.com
jsPerf旨在提供一种简单的方法来创建和共享测试用例,通过运行基准测试来比较不同JavaScript代码段的性能。
尾调用优化 (Tail Call Optimization, TCO)
尾部调用是作为过程的最终操作执行的子例程调用。
尾调用就是一个出现在另一个函数 “结尾” 处的函数调用。这个调用结束后就没有其余事情要做了(除了可能要返回结果值)。
当函数返回之前要评估的最后一件事是函数调用时,可能会发生尾调用优化。在某些情况下,解释器可以重用函数调用的当前堆栈帧而不是创建新的堆栈帧。
非递归的尾调用:
function foo (x) { return x } function bar (y) { return foo( y + 1 ) // 尾调用 } function baz () { return 1 + bar( 40 ) // 非尾调用 } baz() // 42
栈帧
调用一个新的函数需要额外的一块预留内存来管理调用栈,成为栈帧。
小结
对一段代码进行有效的性能测试,特别是与同样代码的另一个选择对比来看看哪种方案更快,需要认真注意细节。
与其打造你自己的统计有效的性能测试逻辑,不如直接使用 Benchmark.js 库,他已经为你实现了这些。但是,编写测试要小心,因为我们很容易就会构造一个看似有效实际却有缺陷的测试,即使是微小的差异也可能扭曲结果,使其完全不可靠。
从尽可能多的环境中得到尽可能多的测试结果已消除硬件 / 设备的偏差,这一点很重要。jsPerf.com 是很好的网站,用于众包性能测试运行。
遗憾的是,很多常用的性能测试执迷于无关紧要的微观性能细节,比如 x++ 对比 ++x。编写好的测试意味着理解如何关注大局,比如关键路径上的优化以及避免落入类似不同的 JavaScript 实现细节这样的陷阱中。
尾调用优化是 ES6 要求的一种优化方法。它使 JavaScript 中原本不可能的一些递归模式变得实际。 TCO 允许一个函数在结尾处调用另一个函数来执行,不需要任何额外资源。这意味着,对递归算法来说,引擎不再需要限制栈深度。