最近阅读《高性能JavaScript》时,在书中的“达夫设备“ 。

对此,有些感悟,同时有些疑问,希望看到的朋友,能帮忙解释下,在此先提前感谢了。

1. 先说自己的理解吧:

  ”达夫设备“的目的是减少迭代次数,提高循环的效率,减少时间,提升性能。

  感受:感觉代码的优化,真的需要用工匠精神来雕琢,代码的思想很好,也很巧妙。

  原文的意思:是否值得使用达夫设备,无论是原始的版本还是修改后的版本,很大程度上依赖于迭代的次数。如果循
                         环迭代次数少于 1'000 次,你可能只看到它与普通循环相比只有微不足道的性能提升。如果迭代次数超过
                         1'000 次,达夫设备的效率将明显提升。例如 500'000 次迭代中,运行时间比普通循环减少到 70%。

2. 自己在代码中遇到的问题:

  (1)原文代码:

      var iterations = Math.floor(items.length / 8),
      startAt = items.length % 8,
      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)

  

      原文说:达夫设备背后的基本理念是:每次循环中最多可 8 次调用 process()函数。循环迭代次数为元素总数除以
          8。因为总数不一定是 8 的整数倍, 所以 startAt 变量存放余数, 指出第一次循环中应当执行多少次 process()。
          比方说现在有 12 个元素,那么第一次循环将调用 process()4 次,第二次循环调用 process()8 次,用 2 次循
          环代替了 12 次循环。

(2) 遇到的问题:

      自己模拟12次循环时,遇到的了问题。

        var items = ['a','b','c','d','e','f','g','h','i','j','k','l'];
        var iterations = Math.floor(items.length / 8),
                startAt = items.length % 8,
               i = 0;
        function process(v){
            console.log(v);
        }
        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);

         执行结果:只执行了4次,后面的8次没有遍历。

            

      自己觉得,应该把“iterations--” 改成 ”iterations--“

      修改后代码:

      var items = ['a','b','c','d','e','f','g','h','i','j','k','l'];
      var iterations = Math.floor(items.length / 8),
            startAt = items.length % 8,
                i = 0;
      function process(v){
        console.log(v);
      }
      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--);

       运行结果:

      

不知是我自己的测试案例有问题,还是书中写的有问题。望遇到相同问题的朋友,共同探讨。在此先感谢了。

达夫设备之js的更多相关文章

  1. 达夫设备(Duff's Device)

    达夫设备设备是一段非常巧妙,看起来非常诡异的c代码,它可以很大的提高程序执行的效率(本文将试验),达夫设备的来源我就不说了,我们来分析一下. 达夫设备是考虑到我们一般用for或者while循环的时候, ...

  2. 高性能JavaScript 达夫设备

    前言 在<高性能JavaScript>一书的第四章算法和流程控制中,提到了减少迭代次数加速程序的策略—达夫设备(Duff's device).达夫设备本身很好理解,但是其效果是否真的像书中 ...

  3. 达夫设备/达夫算法(Duff's Device)

    主要是下面的代码: register n = (count + 7) / 8;   /\* count > 0 assumed \*/ switch (count % 8) { case 0:  ...

  4. 冷知识:达夫设备(Duff's Device)效率真的很高吗?

    ID:技术让梦想更伟大 作者:李肖遥 wechat链接:https://mp.weixin.qq.com/s/b1jQDH22hk9lhdC9nDqI6w 相信大家写业务逻辑的时候,都是面向if.el ...

  5. JS判断设备的类型

    利用JS判断浏览器的用户代理,从而获得设备类型.利用这个方法可以获得用户的设备是移动设备还是PC设备.     JS代码如下:       function browerType() {       ...

  6. 使用 React.js 的渐进式 Web 应用程序:第 1 部分 - 介绍

      使用 React.js 的渐进式 Web 应用程序:第 1 部分 - 介绍 使用 React.js 的渐进式 Web 应用程序:第 1 部分 - 介绍 来自译者 markzhai:大家也知道最近 ...

  7. 在嵌入式设备中使用 JavaScript 的前景

    by Conmajia PC上的JavaScript已经发展到ECMAScript 6(ES6),马上ES10都快出来了(虽然还是草案),但是硬件上的JS却很少听说.这几年手持设备/可穿戴设备的发展非 ...

  8. js 判断浏览器类型及版本

    1.思路: 能力检测 + 字符串检索 2.例子 IE    Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)      ActiveXObject函 ...

  9. 前端js优化方案(二)持续更新

    由于上篇篇幅过长,导致编辑出了问题,另开一篇文章继续: (4)减少迭代次数,最广为人知的一种限制循环迭代次数的模式被称为“达夫设备(Duff`s Device)” Duff`s Device的理念是: ...

随机推荐

  1. 11.05 选择前n个记录

    select ename,salfrom(select (select count(distinct b.sal)from emp bwhere a.sal<=b.sal) as rnk,a.s ...

  2. (转)基于MVC4+EasyUI的Web开发框架经验总结(4)--使用图表控件Highcharts

    http://www.cnblogs.com/wuhuacong/p/3736564.html 在我们做各种应用的时候,我们可能都会使用到图表统计,以前接触过一些不同的图表控件,在无意中发现了图表控件 ...

  3. 用apt-get install一个软件的时候出现错误: 无法解析或打开软件包的列表或是状态文件

    用apt-get install一个软件的时候出现了一个错误: E: Encountered a section with no Package: header E: Problem with Mer ...

  4. Java中Scanner类的使用

    一个可以解析基本类型和字符串的简单文本扫描器. 例如,以下代码使用户能够从 System.in 中读取一个数: public class ApiScanner { public static void ...

  5. pandaboy Merry Christmas

  6. AM335X用RGB888连接LCD如何以16位色彩模式显示图片

    在AM335x中,在连接显示屏的时候,存在一个问题.这个在am335x Sillicon Errata已经提到过 在RGB888模式中   而对于RGB565模式的硬件连接 不难看出,这个RGB是反的 ...

  7. node中exports和module.exports的关系及使用

    在node中,需要记住,在使用exports和module.exports的时候,实际输出的是module.exports. exports指向module.exports,是module.expor ...

  8. 字符识别Python实现 图片验证码识别

    字符型图片验证码识别完整过程及Python实现 1   摘要 验证码是目前互联网上非常常见也是非常重要的一个事物,充当着很多系统的 防火墙 功能,但是随时OCR技术的发展,验证码暴露出来的安全问题也越 ...

  9. 【hdu 6406】Taotao Picks Apples

    [链接] 我是链接,点我呀:) [题意] 题意相当于问你改变一个位置之后. 从左往右扫描最大值.这个最大值会改变多少次. [题解] 假设我们改变的是i这个位置,下面说的a[i]都是改成q之后的a[i] ...

  10. redis 五大数据类型

    一.String set : 添加数据 get : 获得指定 key 的 value del : 删除指定 key append : 往字符串后面添加       append k1 12345    ...