المرجعية. مقدمة للمبتدئين

عاجلاً أم آجلاً ، من المرجح أن يصادف كل مبرمج مفهومًا مثل قياس الأداء.



في أي مكتب ، في أي فريق ، وحتى عندما تكون بمفردك مع Tyler Durden (ولكن فقط إذا كان Tyler الخاص بك مبرمجًا) ، مرة واحدة على الأقل ، سيكون هناك خلاف حول كيفية تنفيذ هذه الوظيفة أو تلك بحيث تعمل بسرعة. لكن بسرعة ، كخاصية ، لا يتم اقتباسها عادةً ، لذلك أقترح التحدث عن كيفية تحويل الملخص بسرعة إلى رقم غير مجرد.



أدوات



يمكنك قياس الأداء باستخدام أدوات مختلفة ، فلنتحدث عن بعض تلك التي صادفتها.



تاريخ



هيكل بيانات أصلي يصف التاريخ / الوقت.

تتلخص جميع القياسات في حقيقة أننا نقيس التاريخ قبل الوظيفة ، ثم التاريخ بعد الوظيفة ، ونأخذ الفرق.



وغني عن القول ، أنه لا يمكن أن يكون هناك أي شك في أي دقة زائدة عن الحاجة لمثل هذه القياسات بسبب خصوصيات تخزين التاريخ في نظام التشغيل.



تتم تهيئة ساعة النظام من الجهاز عند تمهيد نظام التشغيل ، ثم يتم الحفاظ على وقت النظام باستخدام المقاطعات العادية للموقت. ( ويكيبيديا )

ببساطة ، يتم تخزين الوقت مؤقتًا وتحديثه بتردد معين ، ولا يمكن أن تتجاوز دقة قياساتنا تكرار هذا التحديث.



الحالة الوحيدة التي يمكن أن يكون فيها "التاريخ" مفيدًا هي إذا كنت تستبدل البرامج النصية التي تستغرق عدة ثوانٍ لتنفيذها ، ولا يهمك اختلاف ± 100 مللي ثانية. لا أوصي عمومًا باستخدام التاريخ للقياسات.



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 () ليس فقط أكثر دقة من التاريخ ، ولكنه أكثر ملاءمة أيضًا. لا يتعين عليك إجراء أي معالجات إضافية مع تحويل التاريخ إلى الطابع الزمني والعودة ، يمكنك الحصول على الرقم فورًا بوحدات ملائمة.



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