忽略所有代码清洁度和可读性,哪个脚本会更快完成?
这个:
for(var i = 0; i < 10; i++){ --do that thing-- }
或这个:
--do that thing-- --do that thing-- --do that thing-- --do that thing-- --do that thing-- --do that thing-- --do that thing-- --do that thing-- --do that thing-- --do that thing--
或者它们是相同的,性能方面的?
解决方法
通过反复“复制和粘贴”循环体来“展开”循环可以改善或降低性能.
结果取决于……
> …你的JavaScript引擎
> …循环体中的代码
> …你的代码记录得多好(不开玩笑!)
让我们使用Google流行的V8 JavaScript引擎(Chrome,Node)分析性能:
普通循环:
var count = 0; for (var i = 0; i < 10; i++) { count += 1; }
展开循环:
var count = 0; count += 1; count += 1; ... count += 1;
结果:展开的循环速度提高了约10倍.
但是如果我们循环1000次而不是10次呢?然后展开的循环突然变得比普通循环慢10倍!
普通循环:
function f() { return 1; } var count = 0; for (var i = 0; i < 10; i++) { count += f(); }
展开循环:
var count = 0; count += f(); count += f(); ... count += f();
结果:展开的循环速度提高了约50%.
function f() { // bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla return 1; }
突然,展开的循环慢了约20%!
这是为什么?
>解析主体包含少于600个字符的函数时,V8会自动内联代码,包括空格和注释.
>当一个函数在很长的循环中“卡住”时,V8执行on-stack-replacement.
关于最后一个例子:通过添加长> 600个字符注释,我们阻止V8在解析过程中内联函数f并依赖于运行时优化功能(例如’on stack replacement’),它针对整个函数和循环而不是手动重复代码.
正如您所看到的,很难预测这种微观“优化”的结果.所以最好不要这样做 – 除非你针对特定JS引擎的特定版本.
有关性能分析,请参阅https://jsfiddle.net/Lj9v7c2m/ – 根据您的计算机/浏览器/版本,您可能会得到不同的结果.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。