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

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

时间: 2024-10-11 05:32:11

Javascript Loop unrolling Duff device Javascript Duff装置 循环展开的相关文章

[Javascript] Iterate Over Items with JavaScript&#39;s for-of Loop

In this lesson we will understand the For Of loop in Javascript which was introduced in ES6. The for-of loop lets you iterate of an itterable object (array, string, set, or map) and returns each objects value in a specified variable. This excludes pl

前端之JavaScript第一天学习(1)-JavaScript 简介

javaScript 是世界上最流行的编程语言. 这门语言可用于 HTML 和 web,更可广泛用于服务器.PC.笔记本电脑.平板电脑和智能手机等设备. JavaScript 是脚本语言 JavaScript 是一种轻量级的编程语言. JavaScript 是可插入 HTML 页面的编程代码. JavaScript 插入 HTML 页面后,可由所有的现代浏览器执行. JavaScript 很容易学习. JavaScript:写入 HTML 输出 <!DOCTYPE html> <html

轻松学习JavaScript二十九:JavaScript中的this详解

这几天在看很多的JS的代码,多次出现this关键字,有时候表示不理解,就仔细看了这一方面的知识. 在JavaScript语言中,this的定义是:this是包含它的函数作为方法被调用时所属的对象.说明:这句话有点咬 嘴,但一个多余的字也没有,定义非常准确,我们可以分3部分来理解它:1包含它的函数.2作为方法被调用时.3所 属的对象.随着函数使用场合的不同,this的值会发生变化.但是有一个总的原则,那就是this指的是,调用函数的那 个对象. this是Javascript语言的一个关键字,它代

【JavaScript】【算法】JavaScript版排序算法

JavaScript版排序算法:冒泡排序.快速排序.插入排序.希尔排序(小数据时,希尔排序会比快排快哦) 1 //排序算法 2 window.onload = function(){ 3 var array = [0,1,2,44,4, 4 324,5,65,6,6, 5 34,4,5,6,2, 6 43,5,6,62,43, 7 5,1,4,51,56, 8 76,7,7,2,1, 9 45,4,6,7,8]; 10 //var array = [4,2,5,1,0,3]; 11 array

[连载]JavaScript讲义(03)--- JavaScript面向对象编程

[连载]JavaScript讲义(03)--- JavaScript面向对象编程,布布扣,bubuko.com

href=&quot;javascript:xxx(this);&quot;和onclick=&quot;javascript:xxx(this);&quot;的区别

href="javascript:xxx(this);"和onclick="javascript:xxx(this);" 一直以为这两种写法是等同的,今天在项目中使用时发现前者的this根本拿不到触发事件的A标签,而后者可以拿到 一般在做分页按钮时会用A标签来做,但是一般都会写<a href="#" onclick="turnPage(1,10)">之类的 href="#"会导致分页在跳转时页面

JavaScript 学习之第一篇JavaScript的数据类型(2016/8/29 晚 23:12)

1. JavaScript的数据类型 JavaScript 里面有6中数据类型 Boolean String Number Undefined Null Object object(对象)类型包含了数组(arrays) 函数(functions) 以及其他一般对.  数字(Numbers) 类型可以是整型(intergers)或者浮点数(float point)类型以及特殊值NaN 和 Infinity  字符串(Strings)类型包含了空字符串 " ". 布尔值(Booleans)

javascript:history.go(-1)和javascript:history.back(-1)

javascript:history.go(-1)和javascript:history.back(-1) 转自:http://hi.baidu.com/chy0806css/item/b72344ac9aa6a73a030a4dfa go(-1): 返回上一页, 原页面表单中的内容会丢失; back(-1): 返回上一页, 原页表表单中的内容会保留. <input type=button value=刷新 onclick="window.location.reload()"&g

JavaScript学习总结(十四)——JavaScript编写类的扩展方法

在?J?a?v?a?S?c?r?i?p?t?中?可以使?用?类的p?r?o?t?o?t?y?p?e属性来?扩?展?类的属?性?和?方?法,在实际开发当中,当JavaScript内置的那些类所提供的动态方法和动态属性不满足我们实际开发时,我们就可以通过"prototype"属性给自定义类添加方法和属性或者扩展原有的类中的方法和属性. 一.扩展JavaScript内置类,添加动态方法 语法格式: 类名.prototype.方法名 = function([param1],[param2],.