Web 技术研究所

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

不同浏览器对函数操作的性能优化差异

  经常看到在循环中动态定义匿名函数的情况,如果不考虑效率确实没什么问题,但需要高效的代码就最好别这样做,因为某些引擎下定义匿名函数是效率很低的。现在咱就来测试一下关于函数的定义、调用、赋值,等操作在不同浏览器上的性能差异。
<script>
var i,t,f,x;
function echo(t,m){console.log(new Date-t+" <- "+m);};

t=new Date;
for(i=0;i<1E7;i++)(function(){})();
echo(t,"定义并调用");

t=new Date;
f=function(){};
for(i=0;i<1E7;i++)f();
echo(t,"只调用");

t=new Date;
for(i=0;i<1E7;i++)x=function(i){};
echo(t,"定义并赋值");

t=new Date;
for(i=0;i<1E7;i++)(function(i){});
echo(t,"只定义");

t=new Date;
for(i=0;i<1E7;i++)x=f;
echo(t,"只赋值");

t=new Date;
for(i=0;i<1E7;i++);
echo(t,"空循环");
</script>

  这个测试中“只定义”的部分只有IE下非常慢,实际上只是因为IE没对它做优化而已。只定义函数而不对外引用和调用就完全没有价值,和一个空语句一样。所以Chrome和Firefox中把它优化掉了,它基本不消耗资源,而IE下没有这个优化。即使函数不使用也依然会定义它,所以它就比较慢。
  需要测试函数定义所花费的时间就需要让函数有引用,比如把函数放入一个变量中。而变量赋值同样需要开销,看“只赋值”的测试结果在IE和Chrome中是非常快的,但是Firefox中就很慢。现在不管它快还是慢,我们需要计算的是真正定义函数的性能开销,这可以用“定义并赋值”的结果减去“只赋值”的结果得到。这个计算结果在IE中和“只定义”的基本相同。对于优化掉“只定义”的Firefox和Chrome,这个结果就可以说明定义函数是一个很慢的动作了。
  最后是调用,也许说它没啥意义,因为它是无法避免的。但是Firefox中调用函数的效率实在太低太低,比起一直都很快的Chrome和现在赶上了的IE,Firefox是不是该反省下自己了?
网名:
34.203.213.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^