gpt4 book ai didi

javascript - 为什么 V8 使用临时变量来交换两个值优于没有临时变量的实现?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:43:32 24 4
gpt4 key购买 nike

JSPerf测试表明,使用临时变量 c 交换两个值 ab 大大优于仅使用这两个变量和按位运算的替代实现V8.

最快:c = b; b = 一个; a = c;

最慢:a ^= b; b^=一个; a ^= b;

我知道脚本语言没有编译语言所期望的优化,但假设 ab 是整数,为什么按位运算执行得如此糟糕在 Chrome 的 V8 中?为什么这些结果是这样的?

最佳答案

一些观察:

  • 异或交换在几乎任何语言、任何现代硬件上都比较慢。辅助变量大多是免费的。

  • 在一种不错的语言中,第一个版本执行 3 次读取和 3 次写入。 XOR 版本执行 6 次读取、3 次 XOR 操作、3 次写入。此外,XOR-ing 打败了各种额外的下游分析,一个体面的编译器可以在以前的版本上轻松地完成这些分析。

  • 在 JavaScript 中,异或版本实际上执行 6 次读取、6 次或更多类型比较、最多 6 次拆箱、6 次 ToInt32 转换、3 次异或操作、最多 3 次装箱(包括堆分配)、3 次写入.这是假设原始值已经是数字。通过足够的预热和类型分析,像 V8 这样的现代 JS VM 可以优化并避免其中的许多问题,但显然不会比第一个版本更好。

  • 在性能方面,微基准测试具有很大的误导性,尤其是对于像 JavaScript 这样具有复杂和不稳定的运行时特征的语言。不要过于信任 JSPerf 等工具。

  • 这不太可能在任何实际的 JavaScript 程序中产生可观察到的性能差异,所以您为什么要关心?

关于javascript - 为什么 V8 使用临时变量来交换两个值优于没有临时变量的实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35092952/

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