码迷,mamicode.com
首页 > 编程语言 > 详细

Javascript Loop unrolling Duff device Javascript Duff装置 循环展开

时间:2014-11-19 23:51:31      阅读:217      评论:0      收藏:0      [点我收藏+]

标签:style   blog   io   ar   color   sp   java   for   数据   

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装置 循环展开

标签:style   blog   io   ar   color   sp   java   for   数据   

原文地址:http://www.cnblogs.com/qiwubg/p/4109363.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!