此JSPerf测试表明,使用临时变量c
交换两个值a
和b
远远超过仅使用两个变量和按位操作的替代实现V8。
最快:c = b; b = a; a = c;
最慢:a ^= b; b ^= a; a ^= b;
我理解脚本语言没有编译语言所期望的优化,但假设a
和b
是整数,为什么在Chrome中按位操作执行得如此糟糕? V8?为什么这些结果会如此?
答案 0 :(得分:4)
有几点意见:
在任何现代硬件上,几乎所有语言的XOR交换都比较慢。辅助变量大多是免费的。
用一种不错的语言,第一个版本执行3次读取和3次写入。 XOR版本执行6次读取,3次XOR操作,3次写入。此外,XOR-ing打败了各种额外的下游分析,这些分析是一个不错的编译器可以在以前的版本上轻松做的。
在JavaScript中,XOR版本实际上执行6次读取,6次或更多次类型比较,最多6次取消装箱,6次ToInt32转换,3次XOR操作,最多3次装箱(包括堆分配),3次写入。并且假设原始值已经是数字。通过足够的预热和类型分析,像V8这样的现代JS VM可以优化并避免其中的许多,但显然无法比第一个版本更好。
微软标记在性能方面存在很大的误导性,特别是对于具有与JavaScript一样复杂和不稳定的运行时特性的语言。不要过多地信任像JSPerf这样的工具。
这在任何真正的JavaScript程序中都不太可能产生可观察到的性能差异,所以你为什么要关心?