আমি কীভাবে জাভাস্ক্রিপ্ট কোডটি বেঞ্চমার্ক করতে পারি? [বন্ধ]


104

এমন কোন প্যাকেজ আছে যা জাভাস্ক্রিপ্ট কোডটি আমাকে বেঞ্চমার্ক করতে সহায়তা করে? আমি ফায়ারব্যাগ এবং এই জাতীয় সরঞ্জামগুলির উল্লেখ করছি না।

আমি প্রয়োগ করেছি যে দুটি বিভিন্ন জাভাস্ক্রিপ্ট ফাংশন তুলনা করা প্রয়োজন। আমি পার্লের বেঞ্চমার্ক ( বেঞ্চমার্ক.এমপি ) মডিউলটির সাথে খুব পরিচিত এবং আমি জাভাস্ক্রিপ্টে তেমন কিছু সন্ধান করছি।

জাভাস্ক্রিপ্ট কোড বেঞ্চমার্কিংয়ের উপর জোর দেওয়া হয়েছে? আমি কি ফাংশনগুলির এক রান সময় নির্ধারণের সাথে পালাতে পারি?


: একটি DUP হবে বলে মনে হয় stackoverflow.com/search?q=javascript+profiler
steamer25


আমি জানি এটি বুলেটপ্রুফ এবং সমস্ত নয়, তবে যাইহোক যাইহোক সম্পর্কিত: কখনও কখনও আপনি কেবল এটি জানতে চান যে কোনও ফাংশন কার্যকর করার জন্য নেওয়া সময় কীভাবে পরিমাপ করতে হয়
স্কিপি লে গ্র্যান্ড গৌড়ো

1
আমি জাভাস্ক্রিপ্টের বেঞ্চমার্ক সরঞ্জামটি দেখতে পেয়েছি
EscapeNetscape

উত্তর:


36

প্রতিটি ফাংশনের কেবলমাত্র কয়েকটি পুনরাবৃত্তি। একটি পুনরাবৃত্তি সম্ভবত যথেষ্ট হবে না, তবে (আপনার ফাংশনগুলি কতটা জটিল তার উপর নির্ভর করে) কোথাও 100 বা এমনকি 1000 টি পুনরাবৃত্তির কাজটি করা উচিত।

আপনার ফাংশনের কোন অংশগুলি এটি কমিয়ে দিচ্ছে তা যদি আপনি দেখতে চান তবে ফায়ারব্যাগেরও একজন প্রোফাইলার রয়েছে ।

সম্পাদনা করুন: ভবিষ্যতের পাঠকদের কাছে, জেএসপিফার সুপারিশ করা নীচের উত্তরটি সঠিক উত্তর হওয়া উচিত। আমি আমার মুছে ফেলব, তবে আমি এটি করতে পারি না কারণ এটি ওপি দ্বারা নির্বাচিত হয়েছে। কেবলমাত্র অনেকগুলি পুনরাবৃত্তি চালানোর চেয়ে বেঞ্চমার্কিংয়ের আরও অনেক কিছুই রয়েছে এবং জেএসপিআরফ আপনার জন্য এটি যত্ন করে।


12
কেবল আপনার কোডের একটি পূর্ব নির্ধারিত সংখ্যার পুনরাবৃত্তির সময় নির্ধারণ করা মোটেই বুলেটপ্রুফ নয় । এছাড়াও, ফায়ারবগের ওপেন থাকার ফলে ফায়ারফক্সের জাস্ট-ইন-টাইম (জেআইটি) সংকলকটি অক্ষম হয়, যার অর্থ পরীক্ষাগুলি দোভাষীর মধ্যে চলবে, অর্থাত্ তারা অন্যথায় তুলনায় তার চেয়ে ধীর গতিতে। ফায়ারব্যাগের প্রোফাইলার ব্যবহার করা ফলাফলগুলি আপনাকে প্রত্যাশা করবে না।
ম্যাথিয়াস বাইনেন্স

1
@ ম্যাথিয়াস: ভাল কথা বলতে গেলে এই উত্তরটি আসলেই পুরানো।
সাশা চেদিগোভ

2
অবশ্যই, কোনও অপরাধ সাথী নয়। আমি কেবল ভেবেছিলাম যে ভবিষ্যতের রেফারেন্সের জন্য এখনই মন্তব্য করব যে বিষয়ে আরও গবেষণা হয়েছে done
ম্যাথিয়াস বাইনেন্স

4
বা jsben.ch ব্যবহার করুন যেহেতু jsperf ডাউন রয়েছে
এস্কেপনেটস্কেপ

118

জেএসপিফার ডটকম জেএস পারফরম্যান্স পরীক্ষার জন্য যাবার জায়গা। সেখানে শুরু করুন। কমান্ড লাইন বা স্ক্রিপ্টগুলি থেকে নিজের পরীক্ষা চালানোর জন্য যদি আপনার কোনও কাঠামো প্রয়োজন হয় তবে jsperf.com নির্মিত লাইব্রেরিটিতে Benchmark.js ব্যবহার করুন ।

দ্রষ্টব্য: জাভাস্ক্রিপ্ট কোড পরীক্ষা করা যে কোনও ব্যক্তিকে "মাইক্রোব্যাঙ্কমার্কস" এর ক্ষতির বিষয়ে নিজেকে শিক্ষিত করা উচিত (ছোট পরীক্ষাগুলি যা একটি নির্দিষ্ট বৈশিষ্ট্য বা অপারেশনকে লক্ষ্য করে বাস্তব-বিশ্বের কোড নিদর্শনগুলির উপর ভিত্তি করে আরও জটিল পরীক্ষার চেয়ে বেশি)। এই জাতীয় পরীক্ষাগুলি দরকারী হতে পারে তবে আধুনিক জেএস রানটাইম কীভাবে পরিচালিত হয় তার কারণে অসম্পূর্ণতার প্রবণতা রয়েছে। পারফরম্যান্স এবং বেঞ্চমার্কিং সম্পর্কে ভায়াছ্লাভ ইগোরভের উপস্থাপনা সমস্যা (গুলি) এর প্রকৃতির প্রতি অনুভূতি পাওয়ার জন্য দেখার মতো।

সম্পাদনা করুন: আমার জেএসলিটমাসের কাজের উল্লেখগুলি সরিয়ে ফেলা হয়েছে কারণ এটি আর প্রাসঙ্গিক বা কার্যকর নয়।


3
আপডেট: কেবল jsperf.com ব্যবহার করুন - এটি অনেক বেশি ভাল হয়েছে এবং এই ধরণের জিনিসটির জন্য সত্যই ভাল কাজ করে। jslitmus এখনও কাজ করে, তবে বেশিরভাগ সময় সক্রিয়ভাবে বিকশিত হয়নি।
ব্রুফা

এটি উচ্চতর উত্তর। +1
জাস্টিন ফোর্স

1
আমি jsperf ব্যবহার করতে চেয়েছিলাম, তবে এটি এন লুপের জন্য আসল কলটির সময় না দিয়ে এক সময়কালের জন্য কোডটি কতবার চালাতে পারে তা গণনা করা বলে মনে হচ্ছে। আমি তাদের পছন্দ করার একটি বিকল্প ছিল আশা করি।
জয়চ

1
@ জ্যাচ - জেএসপিআফ "অপারেশন / সেকেন্ড" দেয়। আপনার কোডটি চলবে সেই সময়ের মধ্যে (সেকেন্ডে) কেবল সেই মানটি গুণান।
ব্রুফা

4
আপডেট: jsperf আর অনলাইনে নেই, এবং কখন অনলাইনে ফিরে আসবে তার কোনও কথাই নেই। দেখুন এই GitHub থ্রেড আরও তথ্যের জন্য।
জেমস গোল্ড

73

এই মিশ্রণটিতে কেবল একটি দ্রুত টাইমার যুক্ত করা, যা কারওর পক্ষে দরকারী হতে পারে:

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() developer.mozilla.org/en-US/docs/Web/API/Performance/now
thormeier

আমার যা প্রয়োজন কেবল তা - একটি সময় ()
গিশু

1
টাইপস্ক্রিপ্ট সংস্করণ: পেস্টবিন.
আলেকজান্ডার টেলর

1
নোড.জেএস-এর জন্য আপনি ন্যানোসেকেন্ড রেজোলিউশন পেতে প্রসেস হ'ল টাইম () ব্যবহার করতে পারেন ।
জিওনক্রস

56

সহজ উপায়।

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

3
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। তৃতীয় পক্ষের পরিষেবাটি কখনও কখনও ব্যবহার করা সুবিধাজনক নয় এবং কেবল বৈশিষ্ট্যযুক্ত বিল্ট ব্যবহার করা দুর্দান্ত using
ব্রেইনব্যাগ

1
@ ব্রেনবাগ - প্রশ্নটি বেঞ্চমার্কিংয়ের বিষয়ে ছিল, এতে কোডটি কতক্ষণ চলবে তা নির্ধারণের চেয়ে বেশি সময় জড়িত। এছাড়াও, কনসোল টাইমারগুলি কেবল তখনই কার্যকর যদি প্রশ্নে কোডটি 1 মিলিসেকেন্ডের বেশি (তাদের রেজোলিউশনের সীমা) নেয়।
ব্রুফা

আপনি টেস্ট স্যুটে আপনার বেঞ্চমার্কটি চালাতে চাইতে পারেন, যার জন্য টাইমার মানটি অ্যাক্সেস হওয়া দরকার।
জেমসদেভ

20

আমি @ মিউজিক ফ্রিক্স উত্তরগুলির এই সাধারণ প্রয়োগটি ব্যবহার করছি। কোনও বৈশিষ্ট্য নেই, তবে এটি ব্যবহার করা সত্যই সহজ। এটি 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

শালীন ক্রস ব্রাউজারের বেনমার্কগুলি লেখা সত্যিই কঠিন। কেবল আপনার কোডের একটি পূর্ব নির্ধারিত সংখ্যার পুনরাবৃত্তির সময় নির্ধারণ করা মোটেই বুলেটপ্রুফ নয়

@ ব্রোফা ইতিমধ্যে প্রস্তাবিত হিসাবে, জেএসফুউ দেখুন । এটি পর্দার আড়ালে বেঞ্চমার্ক.জেএস ব্যবহার করে।


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)

কোডের একটি উদাহরণ এখানে


সরল স্পষ্টতই আমার ক্ষেত্রে সর্বোত্তম বিকল্প ছিল ... এপিআই-র জন্য প্রতিক্রিয়ার বারের জন্য কিছু পরীক্ষা লিখতে (চূড়ান্ত সঠিক সময়ের প্রয়োজন নেই)।
কাশীরাজা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.