作为一名3年多的web开发人员,我现在意识到,我对浏览器一无所知,而且它们在许多方面可能会有所不同。为了说明这一点,我尝试构建一个“公平测试”来分析JavaScript奇偶校验代码,哪个版本的代码运行得更快
x => (x%2)==0
还是那个
x => (x&1)==0
.
我怀疑只检查最右边的位,应该是更快的方法,但在浏览器世界。。。你可能永远不会知道。下面是完整的JavaScript测试代码:
function evaluateSpeed(func) {
const times = 100000000;
const salt = 96145;
let check = salt;
for (let i = 0; i < times; i++) {
check ^= salt + (i&0xff)<<(1+func(i));
}
return check;
}
function evenStd() {
return evaluateSpeed(x => (x%2)==0);
}
function evenEff() {
return evaluateSpeed(x => (x&1)==0);
}
function test() {
let y1 = evenStd();
let y2 = evenEff();
if (y1 !== y2) {
throw new Error('Semantic error !');
}
else {
document.write("Test is done !");
}
}
test();
下面是Chromium web浏览器中的分析结果:
令我惊讶的是
evenEff()
(位检查功能)运行15次
更慢的
比
evenStd()
(模数除以2函数)铬!以下是Firefox浏览器中相同代码的分析结果:
在Firefox中,我看到了预期的结果
伊文夫()
运行约2倍
更快
而不是替代版本
标准()
. 问题来了,Chromium浏览器的引擎盖下到底发生了什么?为什么会有这么奇怪的结果?它与代码缓存有关吗?也许剩下的运营商是更好的卸载到GPU核心铬案或什么?或者只是测试不够公平,不兼容跨浏览器?