Benchmarking. Introducción para principiantes

Tarde o temprano, es probable que absolutamente todos los programadores se encuentren con un concepto como medir el rendimiento.



En cualquier oficina, en cualquier equipo, e incluso cuando está solo con su Tyler Durden (pero solo si su Tyler es un programador), al menos una vez, habrá una disputa sobre cómo implementar esta o aquella función para que funcione. rápido. Pero la rapidez, como característica, generalmente no se cita, por lo que propongo hablar sobre cómo convertir rápidamente un número abstracto en un número no abstracto.



Herramientas



Puedes medir el rendimiento con diferentes herramientas, hablemos de algunas de las que me he encontrado.



Fecha



Una estructura de datos nativa que describe una fecha / hora.

Todas las medidas se reducen al hecho de que medimos la fecha anterior a la función, luego la fecha posterior a la función y tomamos la diferencia.



No hace falta decir que no puede haber ninguna duda de una precisión redundante de tales mediciones debido a las peculiaridades de almacenar la fecha en el sistema operativo.



El reloj del sistema se inicializa desde el hardware cuando se inicia el sistema operativo, y luego la hora del sistema se mantiene mediante interrupciones regulares del temporizador. ( Wikipedia )

En pocas palabras, la hora se almacena en caché y se actualiza con una frecuencia determinada, y la precisión de nuestras mediciones no puede exceder la frecuencia de esta actualización.



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



, / .





La evaluación comparativa es una actividad muy divertida que ayuda a detectar las áreas problemáticas en el código a tiempo y mejorarlo. Pero esta es también una ocupación asociada a sus propias dificultades.



En este artículo, traté de responder a las preguntas que surgieron en mi época, traté de resaltar algunos puntos interesantes.



¡Gracias por su atención!




All Articles