Javascript Loop unrolling Duff device Javascript Duff装置 循环展开
Javascript 中会用到for 循环,当要循环的数据记录很多的时候,可能会对性能产生很大影响。这时我们可以考虑展开for循环,这时就要用到Duff装置(Duff Device).
先来看一个小例子,用for循环来实现:
function process(data) { htmlStr += data + "<br />"; //div = document.getElementById("myDiv"); //div.innerHTML += data + "<br />"; } function forLoop(values) { console.time(‘forLoopTest‘); for (var i = 0; i < values.length; i++) { process(values[i]); } div.innerHTML = htmlStr; console.timeEnd(‘forLoopTest‘); }
这个for循环可以用duff 展开如下,(Jeff Greenberg 用javascript实现了Duff 装置,这里采用的是Jeff 的实现方法)
function duff(values) { console.time(‘duff test‘); var iterations = Math.ceil(values.length / 8); var startAt = values.length % 8; var i = 0; do { switch (startAt) { case 0: process(values[i++]); case 7: process(values[i++]); case 6: process(values[i++]); case 5: process(values[i++]); case 4: process(values[i++]); case 3: process(values[i++]); case 2: process(values[i++]); case 1: process(values[i++]); } startAt = 0; } while (--iterations > 0); div.innerHTML = htmlStr; console.timeEnd(‘duff test‘); }
Andrew B.King 后来改进了的duff 装置,据说改进后的Dff装置,性能提升可以达到40% 左右。。。我们对应的代码如下:
function newDuff(values) { console.time(‘test1‘); var iterations = Math.floor(values.length / 8); var leftover = values.length % 8; var i = 0; if (leftover > 0) { do { process(values[i++]); } while (--leftover > 0); } do { process(values[i++]); process(values[i++]); process(values[i++]); process(values[i++]); process(values[i++]); process(values[i++]); process(values[i++]); process(values[i++]); } while (--iterations > 0); div.innerHTML = htmlStr; console.timeEnd(‘test1‘) }
具体测试数据,下次再贴上,家里面的老爷机,实在是扛不住,老死机。。。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。