Bagaimana cara rata-rata perintah waktu?

18

Saya menjalankan timebeberapa perintah saya. Sekarang untuk mengukur rata-rata, saya ingin menjalankan dan mengatur waktu perintah saya beberapa kali, dan mendapatkan hasilnya dengan rata-rata yang dihitung dan standar deviasi. Hasilnya akan seperti:

avgtime -n 100 my_command

real    0m5.388s stdev 0m0.068s
user    0m5.380s stdev 0m0.067s
sys     0m0.004s stdev 0m0.000s

Apakah ada alat UNIX untuk ini? Apakah GNU / Linux memilikinya?

Didier Trosset
sumber

Jawaban:

7

Anda dapat mencoba menggunakan modul timeit, tersedia di sistem apa pun dengan Python:

$ python -m timeit "__import__('os').system('my command here')"
10 loops, best of 3: 591 msec per loop
bhdnx
sumber
menggunakan os.system(), menyebabkan biaya panggilan / membuat shell dengan setiap perintah. Mungkin lebih baik menggunakan subprocess.call ()
Anthon
benar, tetapi kemungkinan besar akan tetap konstan
bhdnx
4

Ini bukan alat UNIX atau GNU / Linux, tetapi Anda bisa dengan nyaman menggunakan lingkungan perangkat lunak R untuk komputasi statistik untuk ini. (Namun, saya tidak dapat menemukan sesuatu yang lebih spesifik untuk tugas Anda .)

Mengedit Bagaimana aku bisa meragukannya, ada tentu saja adalah paket patokan untuk R: rbenchmark. Ini ternyata membungkus system.time()yang juga bisa Anda gunakan langsung. Atau lihat ini, pasangan fungsi stopwatch sederhana. Juga lihat "Menjalankan perintah sistem" @Rosetta Code (atau tidak, itu system("command").)

Sunting2 Saya baru saja melihat pertanyaan ini, "Mengukur waktu dalam skrip" di kolom "Terkait" yang tepat, ini dapat digunakan juga, yaitu luangkan waktu, lakukan for-loop ( Nkali), luangkan waktu lagi, hitung waktupan, bagi dengan N. (Lebih mudah lagi, coba time ( for-loop ), parsing outputnya, bagi dengan N).

sr_
sumber
3

Anda dapat menggunakan Rdengan cepat menghitung nilai rata-rata, standar-deviasi dan lainnya yang menarik.

Misalnya, Anda dapat menggunakan waktu GNU untuk menulis beberapa pengukuran runtime ke dalam file CSV:

function measure
{
  f=$1; shift
  n=$2; shift
  echo wall,user,sys,rss > "$f"
  for i in $(seq $n); do
    /usr/bin/time --output "$f" --append --format '%e,%U,%S,%M' "$@" >/dev/null
  done
}

Kemudian Anda dapat menghasilkan nilai dengan R seperti ini:

Rscript --vanilla -e "b=read.csv(file='$f');summary(b);sapply(b, sd);"

Saya telah membuat skrip benchmark kecil yang juga melakukan pencetakan cantik dari output R, misalnya:

$ benchmark.sh 100 ./some_prog arg1 arg2
n=100 | min    | Q1     | med    | mean   | Q3     | max    | std
wall  | 0.0400 | 0.0400 | 0.0500 | 0.0471 | 0.0500 | 0.0800 | 0.00624
user  | 0.0400 | 0.0400 | 0.0400 | 0.0426 | 0.0400 | 0.0700 | 0.00562
sys   | 0      | 0      | 0      | 0      | 0      | 0      | 0.00000
rss   | 2608   | 2657   | 2704   | 2728   | 2764   | 2920   | 95.06524
maxschlepzig
sumber
1

Opsi 1 - sqlite :

buat tabel sederhana dengan kolom perintah dan waktu, dan lihat dengan perhitungan agregasi yang tepat . Setelah penghitungan waktu, tambahkan baris ke tabel.

Keuntungan: lebih mudah untuk mendefinisikan tabel dibandingkan dengan solusi 2.

Kekurangan: Anda perlu (kan?) Peduli tentang penyimpanan data.

Opsi 2 - rrdtool :

Tentukan file basis data rrd, definisi data, dan fungsi agregasi. Setelah penghitungan waktu, masukkan basis data dengan rrdtool update ....

Keuntungan: Anda dapat dengan mudah menghasilkan grafik rrdtool graph .... Tidak ada masalah penyimpanan data (database round robin).

Kekurangan: sedikit lebih sulit untuk mendefinisikan database rrd dibandingkan dengan tabel SQL sederhana / tampilan

Michał Šrajer
sumber