gpt4 book ai didi

Javascript/JSPerf 循环性能

转载 作者:行者123 更新时间:2023-12-03 08:38:19 25 4
gpt4 key购买 nike

最近我一直在深入研究 JS 性能,以及我的另一个问题 Javascript Array Performance引导我解决这个问题。

问题:使用全局变量的循环似乎比使用局部变量的迭代快得多,任何人都可以向我解释为什么吗? --- 这只是我对 JSPerf 理解的错误,但问题 2 仍然存在,但我想没有真正的答案,其余的已经在聊天中与 @Igor-Raush 讨论了 --- 或者我是这么想的, JSPerf 中的测试仍然快 100 倍,然后是基本版本......

  • 我很确定这不是局部变量创建

您可以在此处看到此行为:http://jsperf.com/fastest-array-loops-in-javascript/420 -- 我添加了最后两个测试,但最后一个由于某种原因不起作用,所以我删除了其内容

问题 2(额外问题,有点相关):为什么当您单独在 JSPerf 上运行测试(对于其中一些测试)时,它们的性能始终与同时运行它们时完全不同? (您可以在 While length-- test 上看到这一点)


我正在测试这个,因为(如果您转到我的其他问题),我不认为在测试中循环我的数组应该像现在这样慢。

最佳答案

问题 1

全局情况下性能大幅“提高”的原因是您正在初始化全局 it = 0在准备代码中。在 JSPerf 中,每个测试用例都会运行多次试验。第一次运行测试用例时,它会增加全局 it直到超过arr.length

下次(以及所有后续时间)运行测试用例时,条件 it < arr.length计算结果为 false ,并且甚至没有进入循环。这与“While 循环,基本”测试用例中的情况不同,其中 var i = 0在每次试验之前都会初始化。

你可以在这个Plunker中看到使用全局迭代器变量的速度大约是使用本地迭代器变量的两倍(打开控制台查看结果)。

问题 2

性能差异较大的一个可能原因是,运行所有测试可能会导致在运行后面的测试用例时,数组缓存得更靠近 CPU。当您独立运行测试用例时,它可能需要内存访问。对于像 for 这样的基本内容/while迭代,内存访问是一个真正的瓶颈。然而,这只是一种可能的解释。

关于Javascript/JSPerf 循环性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33129451/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com