কোনও স্ক্রিপ্টের গড় প্রয়োগের সময়কে কীভাবে পরিমাপ করবেন?


23

আমার কাছে দুটি স্ক্রিপ্ট রয়েছে যা প্রতিটি সংখ্যার ফ্যাক্টরিয়াল গণনা করে। আমি জানতে চাই কোনটি দ্রুত timeকমান্ড আমাকে মিলিসেকেন্ড দেয় এবং ফলাফলের সময়ে সময়ে আলাদা:

piousbox@piousbox-laptop:~/projects/trash$ time ruby fac2.rb
30414093201713378043612608166064768844377641568960512000000000000

real    0m0.089s
user    0m0.052s
sys 0m0.028s
piousbox@piousbox-laptop:~/projects/trash$ time ruby fac1.rb
30414093201713378043612608166064768844377641568960512000000000000

real    0m0.091s
user    0m0.048s
sys 0m0.036s
piousbox@piousbox-laptop:~/projects/trash$ time ruby fac1.rb
30414093201713378043612608166064768844377641568960512000000000000

real    0m0.088s
user    0m0.048s
sys 0m0.040s
piousbox@piousbox-laptop:~/projects/trash$ time ruby fac2.rb
30414093201713378043612608166064768844377641568960512000000000000

real    0m0.088s
user    0m0.048s
sys 0m0.028s
piousbox@piousbox-laptop:~/projects/trash$ time ruby fac1.rb
30414093201713378043612608166064768844377641568960512000000000000

real    0m0.087s
user    0m0.064s
sys 0m0.028s
piousbox@piousbox-laptop:~/projects/trash$ time ruby fac2.rb
30414093201713378043612608166064768844377641568960512000000000000

real    0m0.089s
user    0m0.068s
sys 0m0.016s
piousbox@piousbox-laptop:~/projects/trash$ 

স্ক্রিপ্টটি চালাতে আমি গড়পড়তা সময় নিতে পারি কীভাবে? আমি পার্স করতে এবং 100 এর আউটপুট আউট গড়তে timeপারি তবে আমি কী আরও ভাল সমাধানের কল্পনা করতে পারি?


উত্তর:


4

না, গড় গড় সম্পর্কে আপনার ধারণাটি সঠিক।

স্ক্রিপ্ট এক্সিকিউশনটি প্রচুর কারণের উপর নির্ভর করে এবং সেটআপের সময় (মেমরিতে ইন্টারপ্রেটার লোড করা, সেটআপ করা, এবং সম্ভবত বাইকোড বা মেশিন কোডে কোড সংকলন) এবং সত্যিকারের প্রয়োগের সময়ের মধ্যে বিভক্ত হতে হয়।

অভ্যন্তরীণ সম্পাদনের সময়টির দিকে আরও ভালভাবে নজর দেওয়ার জন্য, আপনি স্ক্রিপ্টে নিজেই লুপটি করেন (অর্থাত্ একটি ফ্যাক্টরিয়াল গণনা করার পরিবর্তে, আপনি স্ক্রিপ্টের একটি এক্সিকিউশনের মধ্যে এটি 100 বার গণনা করেন The স্ক্রিপ্টটি একবার সেটআপ হয়ে যাবে এবং অভ্যন্তরীণ রুটিনটি 100 সম্পাদন করবে বার)।

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

অ্যালগরিদম সম্পর্কে আরও ভাল অন্তর্দৃষ্টি পেতে, আমি মনে করি সর্বোত্তম উপায়টি হ'ল (অন্যথায় নিষ্ক্রিয় মেশিনে):

  • একটি একক ফাংশনে অ্যালগরিদম মোড়ানো।
  • নিয়ন্ত্রণকারী অ্যাপ্লিকেশন:
    • একবার ফাংশন কল
    • সিস্টেমটি ("প্রাচীর ঘড়ি") সময় পান এবং 10 (বা যুক্তিসঙ্গত এন) সেকেন্ড যোগ করুন
    • লুপটি প্রবেশ করুন এবং পুনরাবৃত্তি গণনা শুরু করুন
    • ফাংশনে প্রতিটি কল করার পরে, কাউন্টারকে বাড়িয়ে দিন
    • যদি সিস্টেমের সময়টি সেভ করা সময়ের চেয়ে নীচে থাকে তবে অন্য লুপটি করুন
    • বর্তমান প্রাচীর ঘড়ির সময় থেকে সঠিক এন, সম্ভবত ভাসমান পয়েন্ট পান
    • এন দ্বারা বিভক্ত কাউন্টারটি প্রদর্শন করুন: এটি পুনরাবৃত্তির সংখ্যা / সেকেন্ড।

অ্যাপ্লিকেশনটি কেবল একবার চালিত হয়, সমস্ত সেটআপ এবং প্রাইমিং প্রথম অবিরত পুনরাবৃত্তির দ্বারা সম্পন্ন হয়, সুতরাং এটি ওভারহেডগুলি কমিয়ে আনা উচিত (সম্ভবত সময়ের কল ব্যতীত)।

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


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

39

আপনি প্রোগ্রামটির পুনরাবৃত্তিগুলি একটি লুপে চালাতে পারেন; এবং মোট সময়কে পুনরাবৃত্তির সংখ্যার দ্বারা ভাগ করুন:

time for i in {1..10}; do sleep 1; done
real    0m10.052s
user    0m0.005s
sys 0m0.018s

2
খুব সহজ, ভাল। আমি এর {1..10}আগে কখনও দেখিনি এবং অবাক হয়েছি যে এটি কাজ করে, ব্যাশ ম্যানুয়ালটিতে এটি খুঁজে পাচ্ছে না। কেবল দুঃখজনক বিষয় হ'ল আপনি নিজের ফলাফলের বিস্তার (সর্বনিম্ন এবং সর্বাধিক সময়) জানেন না।
w00t

@ w00t:man -P 'less +/Brace\ Expansion' bash
user2683246

ধন্যবাদ @ user2683246! এরপরে আমি এটি gnu.org/software/bash/manual/bash.html# ব্রাসেও পেয়েছি - এক্সটেনশন - কম বিটিডব্লিউর দুর্দান্ত ব্যবহার। এখন আমি কৌতূহল করছি কখন এটি বাশ-এ প্রকাশিত হয়েছিল…
w00t

1
আহা, সংস্করণ 3, 10 বছর পরে আমি ব্যাশ ব্যবহার শুরু করেছি :) tldp.org/LDP/abs/html/bashver3.html
w00t

2
এটি যদি গুগলারের আগমনের জন্য কাজ না করে তবে এটি আপনি চালাচ্ছেন না বলেই হতে পারে bash। এর /bin/bashআগে দৌড়াতে চেষ্টা করুন ।
Cory Klein

14

মাল্টিটাইম নামে একটি সরঞ্জাম রয়েছে যা এটি হুবহু করে: একটি কমান্ড কয়েকবার চালানো, এটি কতক্ষণ সময় নেয় তা পরিমাপ করে (বাস্তব / ব্যবহারকারী / সিস্টেমটি গড়, ন্যূনতম / সর্বাধিক এবং মধ্যবর্তী সময় স্বয়ংক্রিয়ভাবে গণনা করা হয়)

উদাহরণস্বরূপ, অনুরূপ স্ক্রিপ্টটি 100 বার পরিমাপের জন্য:

multitime -q -n 100 "fact1.sh"
===> multitime results
1: -q fact1.sh
            Mean        Std.Dev.    Min         Median      Max
real        0.122       0.032       0.086       0.116       0.171       
user        0.148       0.044       0.096       0.137       0.223       
sys         0.023       0.019       0.000       0.014       0.061 

12

এটি পুরানো তবে এটি গুগলে এত বেশি উপরে উঠেছিল যখন আমি পূর্বে ব্যবহৃত একটি কমান্ড খুঁজছিলাম কিন্তু খুঁজে পেলাম না। যাইহোক, আমার এটি করার পছন্দের উপায়টি হ'ল:

perf stat -r 10 -B sleep 1

এটি ঠিক শেষের দিকে কার্যকর কার্যকর সময় সহ বেশ কিছু বিশদ বিবরণ দেয়:

1.002248382 seconds time elapsed                   ( +-  0.01% )


1

হাইপারফাইন আরেকটি বিকল্প is

নমুনা ব্যবহার:

hyperfine --warmup 3 'ruby fac1.rb'

1
হাইফারফিন অন্যান্য বিকল্পগুলির চেয়ে এত ভাল যে এটি হাস্যকর। রান প্রয়োজন, ওয়ার্মআপ, সুন্দর আউটপুট, মার্কডাউন রিপোর্ট,
মরিচে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.