最近阅读《高性能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. OpenStack、KVM、Docker——Docker之后还需要OpenStack吗?

    原文链接:http://news.csdn.net/article_preview.html?preview=1&reload=1&arcid=2823129 Docker从一个新兴的 ...

  2. Rx (Reactive Extensions)介绍

    Reactive Extensions (Rx) 原来是由微软提出的一个综合了异步和基于事件驱动编程的库包,使用可观察序列和LINQ-style查询操作. 使用Rx, 开发者可以用Observable ...

  3. python海龟的使用

    ############################螺旋正方形############################### import turtle turtle.left(90)for i ...

  4. 完全二叉树(Complete Binary Tree)

    Date:2019-03-25 19:36:45 判断一棵树是否为完全二叉树 #include <queue> using namespace std; void IsComplete(n ...

  5. Linux进程地址管理之mm_struct

    FROM : http://www.cnblogs.com/Rofael/archive/2013/04/13/3019153.html Linux对于内存的管理涉及到非常多的方面,这篇文章首先从对进 ...

  6. 数据库之JDBC入门

    数据表: 代码实现(注:jar包用的8.0版本) import java.sql.*; import java.util.Scanner; public class MyDatabase { publ ...

  7. THUWC2019 划水记

    Day -2 在学校呆了inf天之后终于回家了! Day 0 在家无(tui)所(fei)事(mo)事(yu),顺便被拉出去剪了个头发,想写写thusc2017的题也写不动,一直在网上冲浪,到处乱翻以 ...

  8. 环境搭建Selenium2+Eclipse+Java+TestNG_(一)

    第一步  安装JDK 第二步 下载Eclipse 第三步 在Eclipse中安装TestNG 第四步 下载Selenium IDE.SeleniumRC.IEDriverServer 第五步 下载Fi ...

  9. 04springMVC数据类型转换

    数据类型转换简介 Spring Web MVC中的数据类型转换 内建的类型转换器 自定义类型转换器 1      数据类型转换简介 当从页面提交数据到后台Action的时候,通过请求发送的数据,通常都 ...

  10. 02springMVC理解DispatcherServlet

    DispatcherServlet的作用 DispatcherServlet在Web.xml中的配置 上下文关系 DispatcherServlet初始化顺序 DispatcherServlet中使用 ...