达夫设备(Duff‘s Device)

 众所周知,过多的循环会带来一定的性能开销,增加总体运行时间。而减少迭代次数能够优化性能。”Duff’s Device” 作为广为人知的一种限制循环迭代次数的模式,还是有必要了解的。

下面贴出了几个js版本的Duff's Device实现方式

function duff(items) {
  var len = items.length, //缓存局部变量
    iterations = Math.floor(len / 8),  //商数,存放duff迭代次数
    startAt = len % 8,    //余数,存放duff一次迭代调用process的次数
    i = 0;

  do {
    switch (startAt) {
      case 0:
        process(items[i++]);
      case 7:
        process(items[i++]);
      case 6:
        process(items[i++]);
      case 5:
        process(items[i++]);
      case 4:
        process(items[i++]);
      case 3:
        process(items[i++]);
      case 2:
        process(items[i++]);
      case 1:
        process(items[i++]);
    }

    startAt = 0;
  } while (iterations--);    //书上是--iterations,貌似不对吧,应该是iterations--
};


function duff2(items) {
  let len = items.length;
  let count = Math.floor(len / 8);
  let start = len % 8;
  let i = 0;
  while (start--) {
    // do something
    //第一次跑余数个process
    process(items[i++]);
  }
  while (count--) {
    // do something,
    //后面每次跑8个process
    process(items[i++]);
    process(items[i++]);
    process(items[i++]);
    process(items[i++]);
    process(items[i++]);
    process(items[i++]);
    process(items[i++]);
    process(items[i++]);

  }
};

function duff3(items) {
  var iterations = items.length % 8,
    i = items.length - 1;

  while(iterations){
    // do something
    //第一次跑余数个process
    process(items[i--]);
    iterations--;
  }

  iterations = Math.floor(items.length / 8);

  while(iterations){
    // do something,
    //后面每次跑8个process
    process(items[i--]);
    process(items[i--]);
    process(items[i--]);
    process(items[i--]);
    process(items[i--]);
    process(items[i--]);
    process(items[i--]);
    process(items[i--]);
    iterations--;
  }
}


function process(item) {
  console.log(item)
}


// duff([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
duff2([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
// duff3([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])

 

上一篇:np.random总结


下一篇:css zoom属性兼容ie,firefox,chrome