मैं जावास्क्रिप्ट कोड कैसे बेंचमार्क कर सकता हूं? [बन्द है]


104

क्या कोई पैकेज है जो मुझे बेंचमार्क जावास्क्रिप्ट कोड में मदद करता है? मैं फायरबग और ऐसे उपकरणों का जिक्र नहीं कर रहा हूं।

मुझे 2 अलग-अलग जावास्क्रिप्ट फ़ंक्शंस की तुलना करने की ज़रूरत है जिन्हें मैंने लागू किया है। मैं पर्ल के बेंचमार्क ( बेंचमार्क .pm ) मॉड्यूल से बहुत परिचित हूं और मैं जावास्क्रिप्ट में कुछ इसी तरह की तलाश कर रहा हूं।

क्या बेंचमार्किंग जावास्क्रिप्ट कोड पर जोर दिया गया है? क्या मैं फंक्शंस के सिर्फ एक रन टाइमिंग से भाग सकता हूं




मुझे पता है कि यह बुलेटप्रूफ और सभी नहीं है, लेकिन किसी भी तरह से संबंधित है: कभी-कभी आप बस यह जानना चाहते हैं कि किसी कार्य को निष्पादित करने के लिए समय कैसे मापना है
स्किप्पी ले ग्रैंड गौरू

1
मुझे अच्छा जावास्क्रिप्ट बेंचमार्क टूल आपको यहां मिल सकता है: jsben.ch
EscapeNetscape

जवाबों:


36

प्रत्येक फ़ंक्शन के बस कई पुनरावृत्तियों। एक पुनरावृत्ति शायद पर्याप्त नहीं होगी, लेकिन (आपके कार्य कितने जटिल हैं, इसके आधार पर) 100 के करीब या यहां तक ​​कि 1,000 पुनरावृत्तियों को काम करना चाहिए।

फायरबग में एक प्रोफाइलर भी है यदि आप यह देखना चाहते हैं कि आपके फ़ंक्शन के कौन से हिस्से इसे धीमा कर रहे हैं।

संपादित करें: भविष्य के पाठकों के लिए, JSPerf की सिफारिश करने वाला नीचे का उत्तर सही उत्तर होना चाहिए। मैं अपना डिलीट कर दूंगा, लेकिन मैं ऐसा नहीं कर सकता क्योंकि इसे ओपी ने चुना है। बहुत सारे पुनरावृत्तियों को चलाने की तुलना में बेंचमार्किंग के लिए बहुत कुछ है, और JSPerf आपके लिए इसका ध्यान रखता है।


12
बस अपने कोड के पुनरावृत्तियों की पूर्व-निर्धारित संख्या का समय बुलेटप्रूफ नहीं है । इसके अलावा, फायरबग ओपन फ़ायरफ़ॉक्स के जस्ट-इन-टाइम (JIT) कंपाइलर को निष्क्रिय कर देता है, जिसका अर्थ है कि इंटरप्रेटर में परीक्षण चल रहे होंगे, अर्थात वे जितना हो सके उतना धीमा। फायरबग के प्रोफाइलर का उपयोग करने से आपको वे परिणाम नहीं मिलेंगे, जिनकी आपको उम्मीद थी।
मथियास बिएनेंस

1
@ माथियास: खैर, निष्पक्ष होने के लिए, यह जवाब वास्तव में पुराना है।
साशा चोडगोव

2
ज़रूर, कोई अपराध नहीं। मैंने अभी सोचा था कि मैं भविष्य में संदर्भ के लिए टिप्पणी करूंगा कि इस विषय पर और अधिक शोध किया गया है।
मथियास बिएनेंस

4
या jsben.ch का उपयोग करें क्योंकि jsperf नीचे है
एस्केपनेटस्केप

118

jsperf.com JS प्रदर्शन के परीक्षण के लिए साइट पर जाना है। वहाँ शुरू करो। यदि आपको कमांड लाइन से अपने स्वयं के परीक्षण चलाने के लिए एक रूपरेखा की आवश्यकता होती है या स्क्रिप्ट बेंचमार्क.जेएस का उपयोग करते हैं , तो पुस्तकालय जिस पर jsperf.com बनाया गया है।

नोट: जावास्क्रिप्ट कोड का परीक्षण करने वाला कोई भी व्यक्ति खुद को "माइक्रोबेनचर्च" के नुकसान पर शिक्षित करना चाहिए (छोटे परीक्षण जो वास्तविक दुनिया कोड पैटर्न के आधार पर अधिक जटिल परीक्षणों के बजाय एक विशिष्ट सुविधा या संचालन को लक्षित करते हैं)। इस तरह के परीक्षण उपयोगी हो सकते हैं लेकिन आधुनिक जेएस रनटाइम कैसे काम करते हैं, इसकी वजह से अशुद्धि होती है। व्याचेस्लाव एगोरोव की प्रस्तुति और बेंचमार्किंग पर प्रस्तुति समस्या की प्रकृति के बारे में महसूस करने के लिए देखने लायक है।

संपादित करें: मेरे JSLitmus काम के लिए हटाए गए संदर्भ क्योंकि यह अब प्रासंगिक या उपयोगी नहीं है।


3
अपडेट: बस jsperf.com का उपयोग करें - यह बहुत बेहतर हो गया है, और इस तरह की चीज के लिए वास्तव में अच्छी तरह से काम करता है। jslitmus अभी भी काम करता है, लेकिन काफी समय से सक्रिय रूप से विकसित नहीं हुआ है।
ब्रूफो

यह श्रेष्ठ उत्तर है। +1
जस्टिन फोर्स

1
मैं jsperf का उपयोग करना चाहता था, लेकिन ऐसा लगता है कि एन लूप्स के लिए वास्तविक कॉल को टाइम करने के बजाय यह कितनी बार कोड को एक समय अवधि के लिए चला सकता है। काश उनके पास चुनने का विकल्प होता।
15

1
@ जेज - जेस्पेर "ऑपरेशन / सेकंड" देता है। उस मूल्य को उस समय से गुणा करें (सेकंड में) जिस कोड के लिए आप चलेंगे।
ब्रूफ़

4
अपडेट: jsperf अब ऑनलाइन नहीं है, और कोई भी शब्द नहीं है जब यह ऑनलाइन वापस होगा। अधिक जानकारी के लिए इस github धागे को देखें ।
जेम्स गोल्ड

74

मिक्स में सिर्फ एक क्विक टाइमर जोड़ना, जो किसी को उपयोगी लगे:

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

6
यहाँ क्लोजर का अच्छा उपयोग।
डैंडी

12
अधिक सटीक परिणाम के लिए, कोई व्यक्ति डेवलपरperformance.now()Date()
pmozilla.org/en-US/docs/Web/API/Performance/now

बस मुझे क्या चाहिए - एक टाइम इट ()
गिशु

1
टाइपस्क्रिप्ट संस्करण: pastebin.com/gCs9CB5F
अलेक्जेंडर टेलर

1
नोड.जेएस के लिए आप नैनोसेकंड रिज़ॉल्यूशन प्राप्त करने के लिए process.hrtime () का उपयोग कर सकते हैं ।
Xeoncross

56

बस सरल तरीका है।

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

3
यह स्वीकृत उत्तर होना चाहिए। थर्ड पार्टी सर्विस का उपयोग करना कभी-कभी सुविधाजनक नहीं होता है, और केवल एक साधारण फीचर का उपयोग करना उत्कृष्ट होता है।
ब्रेनबैग

1
@brainbag - यह प्रश्न बेंचमार्किंग के बारे में था, जिसमें केवल समय से अधिक समय शामिल होता है कि कोड कितने समय तक चलता है। इसके अलावा, कंसोल टाइमर केवल तभी उपयोगी होते हैं जब प्रश्न में कोड 1 मिलीसेकंड (उनके रिज़ॉल्यूशन की सीमा) से अधिक हो।
ब्रूफ़ो

आप अपने बेंचमार्क को एक परीक्षण सूट में चलाना चाहते हैं, जिसके लिए टाइमर मूल्य तक पहुंच की आवश्यकता होती है।
जेम्स डे

20

मैं @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;  
};

9

सभ्य क्रॉस-ब्राउज़र बेंचमार्क लिखना वास्तव में कठिन है। बस अपने कोड के पुनरावृत्तियों की पूर्व-निर्धारित संख्या का समय बुलेटप्रूफ नहीं है

जैसा कि @broofa ने पहले ही सुझाव दिया था, jsPerf देखें । यह पर्दे के पीछे बेंचमार्क.जेएस का उपयोग करता है ।


2

यदि कोई कस्टम बेंचमार्क स्क्रिप्ट लिख रहा है, तो ध्यान दें कि कुछ ब्राउज़र्स केवल फ़ंक्शन के बाद डोम में जोड़-तोड़ लागू करते हैं जिसमें वे परिभाषित होते हैं। अधिक विवरण यहाँ http://www.quirksmode.org/blog/archives/2009/08/when_to_read_ou.html


1

यदि आपको कुछ सरल चाहिए तो आप इस तरह से कर सकते हैं:

'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)

यहाँ कोड का एक उदाहरण है


सरल निश्चित रूप से मेरे मामले में सबसे अच्छा विकल्प था ... एपीआई के लिए बेंचमार्क प्रतिक्रिया समय के लिए कुछ परीक्षण लिखना (बेहद सटीक समय की कोई आवश्यकता नहीं)।
काशीराज
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.