Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

JavaScript 调用堆栈对变量访问效率有影响!?

  先来做个小小的实验,看看一个函数内对局部和全局变量的访问效率。 var a;
(function(){
  var i,t,r1,r2,b;
  t=new Date();
  for(i=0;i<1E7;i++)a=i;
  r1=new Date-t;
  t=new Date();
  for(i=0;i<1E7;i++)b=i;
  r2=new Date-t;
  alert("a="+r1+"\nb="+r2);
})();

  在Chrome和IE上,局部变量很明显的比全局变量快,不过在火狐上他们基本没区别。这个实验只是用了一层的调用堆栈,接着来试试多层调用堆栈的情况。我们使用一个递归来做。 var a;
(function(e){
  if(e)return arguments.callee(e-1);
  var i,t,r1,r2,b;
  t=new Date();
  for(i=0;i<1E7;i++)a=i;
  r1=new Date-t;
  t=new Date();
  for(i=0;i<1E7;i++)b=i;
  r2=new Date-t;
  alert("a="+r1+"\nb="+r2);
})(10000);

  IE和火狐下的测试效果没什么变化。Chrome下的测试结果有点奇葩,能看到所有变量的访问效率都降低了,这个不是调用堆栈影响的。把递归次数改为0也一样会出现这个结果。出现这个的原因是Chrome对argument这个玩意儿的解析造成的。具体很复杂,得去看V8引擎的源码才能知道真相。 (function(){
  arguments;//把这个注释掉,在Chrome下效率会提高150%
  var i,t,r,a;
  t=new Date();
  for(i=0;i<1E7;i++)a=i;
  alert(new Date-t);
})();
  从上面几个实验中可以看出:在JavaScript中,函数内访问外层变量的速度在IE和Chrome不如局部变量的访问速度快,在火狐下基本没差别。调用堆栈的叠加不会影响外层变量的访问效率。这是我的结论,如有异议可以提出。
网名:
54.226.58.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^