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)
      }

具体测试数据,下次再贴上,家里面的老爷机,实在是扛不住,老死机。。。

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。