Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/417.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 局部变量的访问时间比全局变量长7倍?_Javascript_Optimization_Benchmarking_Variable Caching - Fatal编程技术网

Javascript 局部变量的访问时间比全局变量长7倍?

Javascript 局部变量的访问时间比全局变量长7倍?,javascript,optimization,benchmarking,variable-caching,Javascript,Optimization,Benchmarking,Variable Caching,我试图对“缓存”math.floor的得失进行基准测试,希望能更快地拨打电话 以下是测试: <html> <head> <script> window.onload = function() { var startTime = new Date().getTime(); var k = 0; for(var i = 0; i < 1000000; i++) k += Math.floor(9.99); var mathFloorTime

我试图对“缓存”math.floor的得失进行基准测试,希望能更快地拨打电话

以下是测试:

<html>
<head>
<script>
window.onload = function()
{
  var startTime = new Date().getTime();
  var k = 0;
  for(var i = 0; i < 1000000; i++) k += Math.floor(9.99);
  var mathFloorTime = new Date().getTime() - startTime;

  startTime = new Date().getTime();
  window.mfloor = Math.floor;
  k = 0;
  for(var i = 0; i < 1000000; i++) k += window.mfloor(9.99);
  var globalFloorTime = new Date().getTime() - startTime;

  startTime = new Date().getTime();
  var mfloor = Math.floor;
  k = 0;
  for(var i = 0; i < 1000000; i++) k += mfloor(9.99);
  var localFloorTime = new Date().getTime() - startTime;

  document.getElementById("MathResult").innerHTML = mathFloorTime;
  document.getElementById("globalResult").innerHTML = globalFloorTime;
  document.getElementById("localResult").innerHTML = localFloorTime;
};
</script>
</head>
<body>
Math.floor: <span id="MathResult"></span>ms <br />
var mathfloor: <span id="globalResult"></span>ms <br />
window.mathfloor: <span id="localResult"></span>ms <br />
</body>
</html>
当然,方差是随机的,但在很大程度上是随机的

在所有情况下[显示所用时间]:
[需要更长时间]mathfloor>Math.floor>window.mathfloor[更快]

为什么会这样?在我的项目中,我一直在使用
var mfloor=Math.floor
,根据我不太令人惊讶的基准测试,我“优化”的努力实际上让脚本慢了很多


有没有其他方法可以让我的代码更“高效”。。。?我正处于基本上需要优化的阶段,所以不,这不是“过早优化”…

我不确定你的基准为什么会这样做

但如果你打算经常打电话给Math.floor,你可以用这个:

var num = 9.99;
var floored = ~~num; // 9
并不是说
~
在字符串(
var num=“9.99”
)、超出32位范围的数字和负数(
~
将四舍五入)上可能会失败

有关更多信息,请参阅


更新
这是一个

在Chrome上,我得到的局部范围返回速度比Math.floor和全局范围快。(window.mfloor)请注意,我没有像原始基准测试中那样使用
窗口引用全局mfloor。
语法

所以,我认为你的测试有两个问题(除了其他答案中提到的变量名混淆)。一个是在window.mfloor上运行循环,另一个是有一个与全局变量同名的局部变量(这只是猜测)

使用我发布的jsbin链接尝试基准测试,然后回复我


以下是我对懒惰者的基准:

window.onload = function(){

  var k = 0, i=0, n = 2000000,
  startTime = +(new Date);
  for(; i < n; ++i) k += Math.floor(9.99);
  var mathFloorTime = (new Date) - startTime;

  window.globalMfloor = Math.floor;
  k = i = 0;
  startTime = +(new Date);
  for(; i < n; ++i) k += globalMfloor(9.99);
  var globalFloorTime = (new Date) - startTime;

  var mfloor = Math.floor;
  k = i = 0;
  startTime = +(new Date);
  for(; i < n; ++i) k += mfloor(9.99);
  var localFloorTime = (new Date) - startTime;

  alert("Math.floor: " + mathFloorTime);
  alert("globalMfloor: " + globalFloorTime);
  alert("mfloor: " + localFloorTime);
};​
window.onload=function(){
变量k=0,i=0,n=2000000,
开始时间=+(新日期);
对于(;i
这两个变量的标签不正确:

var mathfloor: <span id="globalResult"></span>ms <br />
window.mathfloor: <span id="localResult"></span>ms <br />
var mathfloor:ms
window.mathfloor:ms

@David的备选方案值得研究,就像某种回忆录一样。

编辑:哎呀,我没有读到关于域名混淆的答案。事实证明,在Firefox中,访问局部变量比访问Math.floor要快(耗时80%),但访问全局变量则耗时140%


在我最初的回答中,我假设由于闭包处理等原因,局部变量比全局变量更难访问。然而,情况似乎正好相反。

我的问题的目标是更全面。例如:为什么访问局部变量要花很长时间=/Math.floor只是一个例子。Thomas Fuchs在他的一次优化讲座中介绍了~~这个东西,是的,它确实缩短了很多时间,但这不是我想要的,我只是想提一下以防万一。我对你的问题很好奇,我正在自己做一些基准测试。如果我发现任何有趣的东西,我会更新我的答案。我现在觉得自己很愚蠢。非常感谢。你能解释一下为什么Window.mathlool会花很长时间,而Window.Math.floor不会花很长时间吗?我猜这是因为globals在查找Window对象时有特权;你可以对它们进行优化。此页面证实了您的发现,并表明这是因为窗口对象在最好的时候很拥挤。我可能读错了,但您的文本标签似乎指向了错误的东西。看起来应该是:Math.floor:ms
window.mathfool:ms
var mathfool:ms
函数局部变量在全局变量之前搜索。
var mathfloor: <span id="globalResult"></span>ms <br />
window.mathfloor: <span id="localResult"></span>ms <br />