首页 > 代码库 > Javascript Loop unrolling Duff device Javascript Duff装置 循环展开
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‘) }
具体测试数据,下次再贴上,家里面的老爷机,实在是扛不住,老死机。。。
Javascript Loop unrolling Duff device Javascript Duff装置 循环展开
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。