Zaman komutlarının ortalaması nasıl alınır?


18

Ben am timekomutlarıma bazı ing. Şimdi ölçümleri ortalamak için, komutlarımı belirli bir sayıda çalıştırmak ve zamanlamak ve sonuçları hesaplanmış ortalama ve standart sapma ile almak istiyorum. Sonuç şöyle olur:

avgtime -n 100 my_command

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

Bunun için bir UNIX aracı var mı? GNU / Linux'ta bir tane var mı?

Yanıtlar:


7

Python ile herhangi bir sistemde bulunan timeit modülünü kullanmayı deneyebilirsiniz:

$ python -m timeit "__import__('os').system('my command here')"
10 loops, best of 3: 591 msec per loop

kullanarak os.system(), her komutla bir kabuk çağırma / oluşturma ek yüküne neden olur. Muhtemelen daha iyi kullanmak subprocess.call ()
Anthon

doğru, ama yine de sürekli sabit olurdu
bhdnx

4

Tam olarak bir UNIX veya GNU / Linux aracı değil, ancak bunun için istatistiksel hesaplama için R yazılım ortamını rahatça kullanabilirsiniz . ( Yine de göreviniz için daha spesifik bir şey bulamıyorum .)

Düzenleme Sanmam nasıl olabilir, bir kriter paketi var elbette R: rbenchmark. Görünüşe göre system.time()sadece doğrudan kullanabileceğinizi sarar . Ya da bir göz atın, basit bir kronometre fonksiyon çifti. Ayrıca bkz. "Sistem komutu yürütme" @Rosetta Kodu (ya da yapma, değil system("command").)

Edit2 Bu soruyu gördüm , sağ "İlgili" sütununda " Bir kod içinde zaman ölçme ", bu da kullanılabilir, yani zaman alabilir, for-loop ( Ntimes) yapabilir, tekrar zaman alabilir, zaman aralığını hesaplayabilir, N. (Daha da kolay, deneyin time ( for-loop ), çıktısını ayrıştırın, bölün N).


3

ROrtalama, standart sapma ve diğer ilginç değerleri hızlı bir şekilde hesaplamak için kullanabilirsiniz .

Örneğin, bir CSV dosyasına birkaç çalışma zamanı ölçümü yazmak için GNU zamanını kullanabilirsiniz:

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
}

Sonra R ile değerleri şöyle üretebilirsiniz:

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

Ayrıca R çıktısının bazı güzel baskılarını yapan küçük bir karşılaştırma komut dosyası oluşturdum , örneğin:

$ 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

1

Seçenek 1 - sqlite :

komut ve zaman sütunlarıyla basit tablolar oluşturun ve uygun toplama hesaplarıyla görüntüleyin. Zamanlamadan sonra tabloya bir satır ekleyin .

Avantajlar: çözüm 2'ye kıyasla bir tablo tanımlamak daha kolaydır.

Dezavantajları: veri saklamaya dikkat etmeniz gerekir mi?

Seçenek 2 - Rrdtool :

Rrd veri tabanı dosyasını, veri tanımını ve toplama işlevlerini tanımlar. Zamanlamadan sonra, veritabanını ile besleyin rrdtool update ....

Avantajları: ile kolayca grafik oluşturabilirsiniz rrdtool graph .... Veri saklama sorunu yok (robin veritabanı).

Dezavantajları: basit SQL tablosu / görünümüne kıyasla rrd veritabanını tanımlamak biraz daha zor


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.