首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么V8使用临时变量交换两个值要优于不使用临时变量的实现?

为什么V8使用临时变量交换两个值要优于不使用临时变量的实现?
EN

Stack Overflow用户
提问于 2016-01-30 03:56:19
回答 1查看 214关注 0票数 4

这个JSPerf测试表明,使用临时变量c交换两个值ab的性能大大优于在V8中仅使用这两个变量和按位操作的替代实现。

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

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

我知道脚本语言没有编译语言所期望的优化,但假设ab是整数,为什么在Chrome的V8中按位操作的性能会这么差?为什么这些结果是这样的呢?

EN

回答 1

Stack Overflow用户

发布于 2016-01-30 23:21:39

以下是一些观察结果:

  • 异或交换在几乎任何语言中,在任何当代硬件上都要慢一些。辅助变量大部分是免费的。
  • 在一种不错的语言中,第一个版本可以进行3次读取和3次写入。XOR版本执行6次读取,3次XOR操作,3次写入。
  • 在JavaScript中,异或版本实际上执行6次读取,6次或更多类型比较,最多6次取消装箱,6次ToInt32转换,3次异或操作,最多3次装箱(包括堆分配),3次写入。这是假设原始值已经是数字。有了足够的预热和类型分析,像V8这样的现代JS VM可以优化并避免其中的许多问题,但显然永远不会比第一个version.
  • Microbenchmarks更好,当涉及到性能时,尤其是对于像JavaScript这样具有复杂和反复无常的运行时特征的语言来说,这是非常具有误导性的。不要过于信任像JSPerf.
  • 这样的工具在任何真正的JavaScript程序中,这都不太可能产生可观察到的性能差异,所以你为什么要关心呢?
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35092952

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档