2017-05-17 63 views
1

我已经使用JSperf来测试code的小样本。函数声明和函数表达式性能差异

enter image description here

据我碰到了几篇文章,都应该有有一个小的边缘test2的类似的性能。但这里完全相反。有人可以解释为什么巨大的差异?

编辑:我也明白他们之间的差异。请不要将其标记为this或讨论语义差异的其他问题的重复,也不要回答我关于表现的问题。

谢谢。

+0

如何将我们链接到实际测试用例? – Cerbrus

+0

@Cerbrus加入了测试链接 –

+0

谁downvoted,你可以请说明原因吗?将有助于提出更好的问题 –

回答

1

随着JavaScript引擎目前使用的强大优化功能,像这样的微基准测试产生了一些令人误解的结果。例如,我猜你正在测试的是函数调用开销。但它看起来像你的代码写入的方式,你可能(重新)每10次执行一次就定义一次函数定义和/或符号查找; 我猜这不是意图。

this alternative test中,我安排了一些事情以避免函数的重复定义,并添加了一些调用函数的其他方法。这减少了我认为由实验性噪音支配的性能差异。虽然这有时可能会有明显的差异,但我不会认为它们具有统计显着性,因为它们具有实验误差水平。换句话说,它将比赛减少到虚拟领带。

即使在两种方法之间存在一致差异的浏览器中,将函数缓存在局部变量中似乎可以最小化定义和表达式之间的差异。

1

我也明白他们之间的差异。

你也理解these semantic differences

请注意,jsPerf会将您的代码置于一个执行时间被测量的紧密循环中。函数声明需要为每个迭代创建一个块范围,这会显着降低测试速度。这不是你想要衡量的。

+0

同意。出于同样的原因,*引擎之间的明显差异*在微观基准测试中远高于真实世界的使用情况。 jsPerf测量的差异因子不一定意味着对典型应用程序有任何意义。 –

+0

@Bergi你的意思是'函数声明*需要*创建一个块范围'?每个循环都不会引入自己的块范围吗?或者你的意思是没有声明的块范围是'空',可以优化掉吗? –

+0

@ie_m,我怀疑块范围可以按写入的方式进行优化,它包含被调用函数的函数定义。 –