最近,我一直在认真研究JS性能,而我的Javascript Array Performance这个其他问题将我引向这个问题。
问题:
使用全局变量进行循环似乎比使用局部变量进行循环要快,有人可以向我解释一下,为什么呢? ---这只是我对JSPerf理解的错误,但问题2仍然存在,但我想对此没有真正的答案,其余的已在聊天中与@ Igor-Raush讨论了---或因此,我认为,在JSPerf中进行的测试仍然要快100倍,然后是基本版本...
我很确定这不是局部变量的创建
您可以在这里看到此行为:http://jsperf.com/fastest-array-loops-in-javascript/420-我添加了最后两个测试,但是由于某种原因,最后一个测试不起作用,因此我删除了其内容
问题2(额外问题,相关种类):
为什么当您在JSPerf上单独运行测试(对于其中一些测试)时,它们的性能始终完全不同,而不是一次运行? (您可以在While长度测试中看到它)
我正在对此进行测试,因为(如果您提到了另一个问题),我认为在测试中遍历数组不应该像现在这样慢。
最佳答案
问题1
在全局情况下大幅提高性能的原因是,您正在准备代码中初始化全局it = 0
。在JSPerf中,每个测试用例都运行多个测试。第一次运行测试用例时,它将递增全局it
,直到超过arr.length
。
下一次(以及所有随后的所有时间)运行测试用例,条件it < arr.length
评估为false
,甚至没有进入循环。在“ While循环,基本”测试用例中不是这种情况,其中var i = 0
在每次试用之前都已初始化。
您可以在此Plunker中看到,使用全局迭代器变量的速度大约是使用本地迭代器变量的速度的两倍(打开控制台查看结果)。
问题2
性能差异很大的一个可能原因是,运行所有测试可能会导致在运行后续测试用例时将阵列缓存到离CPU更近的位置。独立运行测试用例时,可能需要访问内存。对于像for
/ while
迭代这样基本的内容,
内存访问是一个真正的瓶颈。但是,这只是一种可能的解释。