标杆管理。初学者简介

迟早,绝对每个程序员都可能会遇到诸如衡量性能的概念。



在任何办公室,任何团队中,甚至当您独自与Tyler Durden(但仅在Tyler是程序员的情况下)时,也至少有一次关于如何实现此功能或该功能以使其起作用的争议。快速。但是通常不引用快速作为一种特征,因此我建议讨论如何快速将摘要转换为非抽象数字。



工具类



您可以使用不同的工具来衡量性能,让我们谈谈我遇到的一些工具。



日期



描述日期/时间的本机数据结构。

所有度量都归结为以下事实:我们先度量函数之前的日期,然后度量函数之后的日期,然后求出差值。



不用说,由于在OS中存储日期的特殊性,此类测量的任何冗余精度都是毫无疑问的。



操作系统启动时,系统时钟从硬件初始化,然后使用常规计时器中断维护系统时间。维基百科

简而言之,时间是以特定频率缓存和更新的,并且我们的测量精度不能超过此更新的频率。



Date可以派上用场的唯一情况是,如果要替换需要几秒钟才能执行的脚本,那么±100ms的差异对您而言并不重要。我通常不建议使用日期进行测量。



Performance.now()



返回以毫秒为单位测量的时间戳,精度为千分之一毫秒。



对于Node.js,度量是从当前执行线程的开始算起的;对于浏览器,是从PerformanceTiming.navigationStart事件计算的。



函数执行时间的度量如下:



    const start = performance.now();

    myAwesomeFunc();

    const end = performance.now();

    //   
    const diffSec = (end - start) / 1000;

    //  -   .
    console.log('op/sec: ' + (1 / diffSec);


我更喜欢以op / sec格式比较数字,而不是0.00000546654。

Performance.now()不仅比Date更准确,而且更加方便。您无需执行任何其他操作即可将日期转换为时间戳并返回,您将立即获得方便单位的数字。



Benchmark.js



. , .



    var suite = new Benchmark.Suite;

    // add tests
    suite.add('RegExp#test', function() {
        /o/.test('Hello World!');
    })
    .add('String#indexOf', function() {
        'Hello World!'.indexOf('o') > -1;
    })
    .add('String#match', function() {
        !!'Hello World!'.match(/o/);
    })
    // add listeners
    .on('cycle', function(event) {
        console.log(String(event.target));
    })
    .on('complete', function() {
        console.log('Fastest is ' + this.filter('fastest').map('name'));
    })
    // running
    .run();


Benchmark.js . mocha, , .





. , : js, .





:



— , .

.





    function checkLen(array: number[]) {
        let len = 0;

        for (let i = 0; i< 1_000_000; i++) {
            len = array.length;
        }

        return len;
    }


*: 720.4278 op/sec

*- .



, .

, , , .



, , , .

, Hrodvitnir? , . -, :



    function checkLen(array: number[]) {

        let len = 0;

        len = array.length;

        for (let i = 0; i< 1_000_000; i++) {
        }

        return len;
    }


: 718.3247 op/sec

: .



: 0.28%, , . , .



, . , js .



- . , , , . .



, .



, , . . LICM.



, :



    function checkLen(
        array: number[],
        len: number[] //   1000000 
        ) {

        for (let i = 0; i< 1_000_000; i++) {
            len[i] = array.length;
        }

        return len;
    }


: 330.0807

, , , , , , , , , , .



, .

, , .




, .



1 1,000,000.



    const testArray = _.range(1, 1_000_000).toArray();
    //     1  1,000,000


, :



    function checkFilter(array: number[]) {
        return _(array).where(item => !!(item % 2)).toArray()
    }


: 23.4559

-, , filter , lodash.

,



, :



: 13.3961

. , lodash, .



, - .





:



No
1 30 30
2 27 28.5
3 18 25
4 24 24.75
5 13 22.4


, , .



, 10 , 10 .

, , , .

, , "", , , , -. , , , .





: .

.



, , / , . ., , , .



. , .





, , , .





( , ).



, , , .



, "": . , .



, . , .



.



:



    function checkFilter(array: number[]) {
        return _(array).where(item => !!(item % 2)).toArray()
    }


:



    function checkFilter(array: number[]) {
        _(array).where(item => !!(item % 2)).toArray()
    }


, , , , , .





, , , .



, , , . , .

, - — .



10,000,000 75 .



, .





, . , .



, .



, , , 10 , 200 .



, 200 , , .

, . , , . , . , , — .





. , .



, , .



— 25% , 25% , . .



: , , .

. .

, - , , , , .





:



    function checkFilter(array: number[]) {
        return _(array).where(item => !!(item % 2)).toArray()
    }


:



: 23.4559

: ? , . ?



. - - . , Array lodash, , .



, / .





基准测试是一个非常有趣的活动,有助于及时发现并改进代码中的问题区域。但这也是与其自身困难相关的职业。



在本文中,我试图回答我所遇到的问题,并试图突出一些有趣的观点。



感谢您的关注!




All Articles