zoukankan      html  css  js  c++  java
  • JavaScript 执行性能比较和性能测试的方法(作者万戈)

    JavaScript 执行性能比较和性能测试的方法(作者-万戈)

    JavaScript 松散的语言特性注定了它是一门灵活的语言,为了达到同一种功能或者效果,我们可能会有多种不同的实现方法,但是哪种方法才是最好的呢?我们又可以从可读性、可扩展以及执行性能等方面去比较。本文就从执行性能的角度探讨一下客观、直观的 JavaScript 性能比较和性能测试的方法。

    为什么要做 JavaScript 的性能测试和比较?

    很多人都会有这样的疑问,现在的计算机硬件都在提升,执行的响应速度越来越快,浏览器的解释器也越来越强大,JS 的性能问题还值得关注吗?确实,JavaScript 有良好的垃圾回收机制,区区几个内存泄漏也不会导致我们的电脑崩溃,但我们依然要追求极致的用户体验,特别是在 JavaScript 处理动画效果等大量的运算时,性能问题就尤为突出,不可小觑。

    怎么做 JavaScript 的性能测试和比较?

    随着越来越多的人重视 JavaScript 的性能问题,也有越来越多的 JS 性能测试框架和一些工具诞生,比如说 JSLitmus、jsperf 等等,今天本文探讨的是一种比较简单、实用、容易上手的 JS 性能测试的方法。

    举例来说,现在有一个只包含数字类型的数组,然后我会用两种方法对数组元素求和,比较两个方法的性能。

    首先生成这么一个长度是 10000 的 [0, 1, 2, 3, .... 9999] 数组,长度不能太短,否则比较差值不大,效果不是很明显。

    var arr = [],     // 声明一个空数组
        sum = 0;      // 总和初始值
         
    // 生成一个长度是 10000 的数组
    for (var index = 0, len = 10000; index<len; index++) {
        arr.push(index);
    }

    第一种方法是用 for 循环去累加 sum 变量,得到最终结果。

    // for 循环
    function forLoop(arr) {
        var i = 0,
            l = arr.length;
        for (; i<l; i++) {
            sum += arr[i];
        }
    }

    第二种方法是用递归,用数组的 shift() 方法每次删除数组的第一个元素,并将其累加,递归执行。

    // shift 递归
    function shiftLoop(arr) {
        if (!!arr.length) {
            sum += arr.shift();
            arguments.callee(arr);
        }
    }

    分别执行以上这两个方法,其实功能都是一样一样的,而我们肉眼几乎无法分辨这两者到底谁执行的更快,这时候我们就要用事实说话,让数据说话,编写以下简单的性能测试函数,就能知道答案了。

    // 最简单的性能测试函数
    function test(fn, param) {
        var s, d;
        // 记录执行的起始时间
        s = new Date().getTime();
        // 执行待测试的方法
        fn(param);
        // 记录执行的结束时间
        d = new Date().getTime();
        // 输出待测试方法所运行的结果和耗时
        alert( '计算结果:' + sum + ',耗时:' + (d-s) + '毫秒' );
    }

    最后,再分别执行刚才编写的 test() 方法,其参数就是需要测试的方法名和该方法所用到的参数:

    // 分别执行看结果
    // test(forLoop, arr);
    test(shiftLoop, arr);

    在我的电脑上测试发现,用 for 循环仅需 0~1 毫秒,而用 shift 递归则需要 75 毫秒左右,可见经过比较得知,for 循环比 shift 递归执行速度更快,性能更佳!

    只要了解其中原理,在平时写 JS 的过程中对性能有犹豫的时候,你也可以编写这么一个简单的方法来帮助你择优录取!

  • 相关阅读:
    c++语言 运算符重载 使用重载运算符实现类的加法运算
    c++语言 类模板的使用 类模板的实现
    C++语言 通过类模板实现加法计算器
    C++语言 对动物的行为实现多态
    c++语言 友元类和友元方法 将普通函数声明为友元函数
    C++语言 通过构造函数初始化学生信息
    c++语言 静态成员数据和静态方法
    欧拉回路心得
    POJ2965 The Pilots Brothers' refrigerator(枚举)
    HDU1269 迷宫城堡(有向图的强连通分量(scc))
  • 原文地址:https://www.cnblogs.com/liuu/p/3092959.html
Copyright © 2011-2022 走看看