JavaScript中的整数和小数运算速度

JavaScript中的整数和小数运算速度,javascript,Javascript,这是我测试的代码 (函数(){ 变量i,x; 时间('a'); 对于(i=x=0;i1000){ i++; x=0; } } 控制台。时间结束('a'); 时间('b'); 对于(i=x=0;i1){ i++; x=0; } } 控制台。时间结束('b'); })(); 变量i,x; 控制台。时间('c'); 对于(i=x=0;i1000){ i++; x=0; } } 控制台。时间结束('c'); 控制台。时间('d'); 对于(i=x=0;i1){ i++; x=0; } } 控制台。时间

这是我测试的代码

(函数(){
变量i,x;
时间('a');
对于(i=x=0;i<1000000;x++){
如果(x>1000){
i++;
x=0;
}
}
控制台。时间结束('a');
时间('b');
对于(i=x=0;i<1000000;x+=0.001){
如果(x>1){
i++;
x=0;
}
}
控制台。时间结束('b');
})();
变量i,x;
控制台。时间('c');
对于(i=x=0;i<1000000;x++){
如果(x>1000){
i++;
x=0;
}
}
控制台。时间结束('c');
控制台。时间('d');
对于(i=x=0;i<1000000;x+=0.001){
如果(x>1){
i++;
x=0;
}
}

控制台。时间结束('d')一个答案被作者删除了,所以我的评论也被删除了。以下是我的发现:

编辑

我纠正了我的愚蠢(我希望。@Bergi会让我保持正直)。修改了实验,并在下面修改了评论。范围似乎是个问题。使用全局范围的变量运行速度较慢,使用局部范围的变量运行速度较快

结束编辑

我认为问题在于解决全局范围和/或范围层次结构中的变量

实验:

  • 在IIFE(“a”和“b”)中,注释掉
    var i,x
    声明
  • 将“d”转换为构造函数。实例化了一个新对象
铬的结果:

  • “a”似乎慢了50%左右
  • “b”的运行速度与原来的“d”一样慢
  • 作为一个对象,“d”跑得更快,5-8倍,大概
注:

  • 相对而言,Chrome与SO snippet runner的结果更为显著

  • 原始的“d”和对象“d”在SO snippet runner中运行几乎相同。很有趣

(函数(){
//变量i,x;
时间('a');
对于(i=x=0;i<1000000;x++){
如果(x>1000){
i++;
x=0;
}
}
控制台。时间结束('a');
时间('b');
对于(i=x=0;i<1000000;x+=0.001){
如果(x>1){
i++;
x=0;
}
}
控制台。时间结束('b');
})();
变量i,x;
控制台。时间('c');
对于(i=x=0;i<1000000;x++){
如果(x>1000){
i++;
x=0;
}
}
控制台。时间结束('c');
控制台。时间('d');
对于(i=x=0;i<1000000;x+=0.001){
如果(x>1){
i++;
x=0;
}
}
控制台。时间结束('d');
函数sloePoke(){
这个q,,
这个,r,,
this.go=函数(){
控制台。时间('d');
对于(this.q=this.r=0;this.q<1000000;this.r+=0.001){
如果(此.r>1){
这个.q++;
这个r=0;
}
}
控制台。时间结束('d');
}
}
var sloth=新sloePoke();

sloth.go();
很难确定确切的原因,但是可以观察到一些事情

首先,对于范围中的示例,可能会丢弃
x
,这至少使此计算不重要。在优化过程中很容易看到
x
永远不会被使用,因此无需对其进行评估

至于第二个例子,十进制和整数并没有造成差异。例如,你可以尝试使用
x+=7
,你会有一个相当的延迟

控制台时间('d'); 对于(i=0,x=0;i<100000000;x+=7){ i++; };
console.timeEnd('d'))
您的结果在不同浏览器之间是否一致?JavaScript中没有真正的整数。这都是float.JS基本运算符
将浮点转换为整数,然后移位,然后将结果转换回浮点。因此,这些操作比执行算术和
数学.floor
which不做与之之间的转换。还要注意,
0.001
不可能表示精确的浮点值。如果添加速度测量值,请不要忘记在哪个系统上的哪个浏览器中。(Fwiw,我可以在Chrome/59.0.3071.90(Windows NT 6.1;WOW64)上复制):a:2500ms,b:2060ms,c:3710ms,d:26600ms)@Sylvester JS引擎在任何时候都会在内部使用整数,类似的结果在Fireworks中可以看到。Edge太慢了……我放弃了。你忘了在某个地方声明
var q,r
,并且在案例d中你没有将
x=0
更改为
r=0
,当然没有重置
r
,运行速度会提高1000倍。”非常常见,可能在任何给定浏览器会话的JS中的许多地方。”-不。变量是按浏览上下文(窗口/选项卡中的页面)管理的,而不是按会话管理的。只有特定页面上的代码才重要。