سؤال

هل هناك حزمة تساعدني في قياس كود JavaScript؟أنا لا أشير إلى Firebug ومثل هذه الأدوات.

أحتاج إلى مقارنة وظيفتين مختلفتين لجافا سكريبت قمت بتنفيذهما.أنا على دراية بمقياس بيرل (المعيار.م) وأنا أبحث عن شيء مماثل في JavaScript.

هل تم التركيز على قياس أداء كود JavaScript في الخارج؟هل يمكنني الإفلات من توقيت تشغيل الوظائف مرة واحدة فقط؟

هل كانت مفيدة؟

المحلول

<ديل> الوقت فقط عدة تكرارات لكل وظيفة. واحد التكرار ربما لن يكون كافيا، ولكن (اعتمادا على مدى تعقيد مهامكم) مكان أقرب إلى 100 أو حتى 1000 التكرار ينبغي القيام بهذه المهمة.

لديه <ديل> الحرائق أيضا التعريف إذا كنت ترغب في معرفة أي أجزاء من وظيفة الخاص بك تتباطأ عليه.

تعديل: للقراء المستقبل، يجب أن تكون الإجابة التالية التوصية JSPerf الإجابة الصحيحة. وأود أن حذف الألغام، ولكن لا أستطيع لأنه قد تم اختيارها من قبل OP. هناك ما هو أكثر من ذلك بكثير لقياس من مجرد تشغيل العديد من التكرارات، وJSPerf يعتني هذا بالنسبة لك.

نصائح أخرى

jsperf.com هو الموقع المفضل لاختبار أداء JS.ابدأ هناك.إذا كنت بحاجة إلى إطار عمل لتشغيل الاختبارات الخاصة بك من سطر الأوامر أو استخدام البرامج النصية Benchmark.js, ، المكتبة التي تم بناء موقع jsperf.com عليها.

ملحوظة: يجب على أي شخص يختبر كود جافا سكريبت أن يثقف نفسه حول مخاطر "العلامات الدقيقة" (اختبارات صغيرة تستهدف ميزة أو عملية معينة، بدلاً من الاختبارات الأكثر تعقيدًا المستندة إلى أنماط التعليمات البرمجية في العالم الحقيقي).يمكن أن تكون مثل هذه الاختبارات مفيدة ولكنها عرضة لعدم الدقة نظرًا لكيفية عمل أوقات تشغيل JS الحديثة. عرض فياتشيسلاف إيجوروف حول الأداء وقياس الأداء يستحق المشاهدة للتعرف على طبيعة المشكلة (المشاكل).

يحرر: تمت إزالة الإشارات إلى أعمالي في JSLitmus لأنها لم تعد ذات صلة أو مفيدة.

وفقط إضافة الموقت السريع إلى المزيج، الذي شخص قد تجد من المفيد:

var timer = function(name) {
    var start = new Date();
    return {
        stop: function() {
            var end  = new Date();
            var time = end.getTime() - start.getTime();
            console.log('Timer:', name, 'finished in', time, 'ms');
        }
    }
};

ومن الناحية المثالية فإنه سيوضع في فئة ولا تستخدم العالمية كما فعلت لأغراض المثال أعلاه. استخدامه سوف تكون بسيطة جدا:

var t = timer('Some label');
// code to benchmark
t.stop(); // prints the time elapsed to the js console

وفقط بطريقة بسيطة.

console.time('test');
console.timeEnd('test');

ولقد تم استخدام هذا التطبيق البسيط للإجابةmusicfreaks. لا توجد ميزات، وإنما هو حقا سهلة الاستخدام. وهذا bench(function(){return 1/2;}, 10000, [], this) حساب 1/2 10،000 مرات.

/**
 * Figure out how long it takes for a method to execute.
 * 
 * @param {Function} method to test 
 * @param {number} iterations number of executions.
 * @param {Array} args to pass in. 
 * @param {T} context the context to call the method in.
 * @return {number} the time it took, in milliseconds to execute.
 */
var bench = function (method, iterations, args, context) {

    var time = 0;
    var timer = function (action) {
        var d = Date.now();
        if (time < 1 || action === 'start') {
            time = d;
            return 0;
        } else if (action === 'stop') {
            var t = d - time;
            time = 0;    
            return t;
        } else {
            return d - time;    
        }
    };

    var result = [];
    var i = 0;
    timer('start');
    while (i < iterations) {
        result.push(method.apply(context, args));
        i++;
    }

    var execTime = timer('stop');

    if ( typeof console === "object") {
        console.log("Mean execution time was: ", execTime / iterations);
        console.log("Sum execution time was: ", execTime);
        console.log("Result of the method call was:", result[0]);
    }

    return execTime;  
};

وانه من الصعب حقا أن يكتب المعايير عبر متصفح لائقة. ببساطة توقيت عدد محدد مسبقا من التكرارات من التعليمات البرمجية غير لا الرصاص على الإطلاق .

وكماbroofa اقترح بالفعل، تحقق من jsPerf . ويستخدم Benchmark.js وراء الكواليس.

وإذا كتابة سيناريو المؤشر مخصصة مما لا شك فيه أن نلاحظ أن بعض المتصفحات تنطبق التلاعب دوم إلا بعد وظيفة التي يتم تعريفها والعضوية. مزيد من التفاصيل هنا http://www.quirksmode.org/blog/archives/2009/08 /when_to_read_ou.html

إذا كنت بحاجة إلى شيء بسيط يمكنك القيام به مثل هذا:

'use strict'
console.clear()

const powerOf = x => y => Math.pow(x, y)
const powerOfThree = powerOf(3)

function performanceCalc(fn, ...params) {
    const start = +new Date()
    const result = fn(...params)
    const end = +new Date()

    console.log(`Result: ${result}. Execution Time: ${end - start} ms`)
}

performanceCalc(powerOfThree, 2)

هنا مثال من التعليمات البرمجية في

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top