Avaliação comparativa. Introdução para iniciantes

Mais cedo ou mais tarde, absolutamente todo programador provavelmente encontrará um conceito como medição de desempenho.



Em qualquer escritório, em qualquer equipe, e mesmo quando você estiver sozinho com seu Tyler Durden (mas apenas se seu Tyler for um programador), pelo menos uma vez, haverá uma disputa sobre como implementar esta ou aquela função para que funcione velozes. Mas rápido, como uma característica, geralmente não é citado, então eu proponho falar sobre como transformar rapidamente um número abstrato em um número não abstrato.



Ferramentas



Você pode medir o desempenho com ferramentas diferentes, vamos falar sobre algumas das que encontrei.



Encontro



Uma estrutura de dados nativa que descreve uma data / hora.

Todas as medições se resumem ao fato de que medimos a data antes da função, depois a data após a função, e calculamos a diferença.



Desnecessário dizer que não pode haver dúvida de qualquer precisão redundante de tais medições devido às peculiaridades de armazenar a data no sistema operacional.



O relógio do sistema é inicializado a partir do hardware quando o sistema operacional é inicializado e, em seguida, a hora do sistema é mantida usando interrupções regulares do cronômetro. ( Wikipedia )

Simplificando, o tempo é armazenado em cache e atualizado em uma determinada frequência, e a precisão de nossas medições não pode exceder a frequência desta atualização.



, Date , , , ± 100 . Date .



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, . - timestamp , .



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, , .



, / .





O benchmarking é uma atividade muito divertida que ajuda a perceber as áreas problemáticas no código e a torná-lo melhor. Mas esta é também uma ocupação associada às suas próprias dificuldades.



Neste artigo, procurei responder às questões que surgiram na minha época, procurei destacar alguns pontos interessantes.



Obrigado pela atenção!




All Articles