GNU/Linux >> Belajar Linux >  >> Linux

Apakah perintah UNIX `time` cukup akurat untuk benchmark?

Saat ini, imo, tidak ada alasan untuk menggunakan time untuk tujuan pembandingan. Gunakan perf stat alih-alih. Ini memberi Anda informasi yang jauh lebih berguna dan dapat mengulangi proses pembandingan kapan saja dan melakukan statistik pada hasilnya, yaitu menghitung varians dan nilai rata-rata. Ini jauh lebih andal dan mudah digunakan seperti time :

perf stat -r 10 -d <your app and arguments>

-r 10 akan menjalankan aplikasi Anda 10 kali dan melakukan statistik di atasnya. -d menghasilkan lebih banyak data, seperti cache yang hilang.

Jadi sementara time mungkin cukup andal untuk aplikasi yang berjalan lama, namun pasti tidak dapat diandalkan seperti perf stat . Gunakan itu sebagai gantinya.

Tambahan: Jika Anda benar-benar ingin tetap menggunakan time , setidaknya jangan gunakan perintah bash-builtin, tetapi real-deal dalam mode verbose:

/usr/bin/time -v <some command with arguments>

Outputnya kemudian misalnya:

    Command being timed: "ls"
    User time (seconds): 0.00
    System time (seconds): 0.00
    Percent of CPU this job got: 0%
    Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.00
    Average shared text size (kbytes): 0
    Average unshared data size (kbytes): 0
    Average stack size (kbytes): 0
    Average total size (kbytes): 0
    Maximum resident set size (kbytes): 1968
    Average resident set size (kbytes): 0
    Major (requiring I/O) page faults: 0
    Minor (reclaiming a frame) page faults: 93
    Voluntary context switches: 1
    Involuntary context switches: 2
    Swaps: 0
    File system inputs: 8
    File system outputs: 0
    Socket messages sent: 0
    Socket messages received: 0
    Signals delivered: 0
    Page size (bytes): 4096
    Exit status: 0

Terutama perhatikan bagaimana ini mampu mengukur puncak RSS, yang seringkali cukup jika Anda ingin membandingkan efek tambalan pada konsumsi memori puncak. Yaitu. gunakan nilai tersebut untuk membandingkan sebelum/sesudah dan jika ada penurunan yang signifikan pada puncak RSS, berarti Anda melakukan sesuatu dengan benar.


time menghasilkan waktu yang cukup baik untuk tolok ukur yang berjalan lebih dari satu detik jika tidak waktu yang dibutuhkan exec() Proses mungkin lebih besar dibandingkan dengan waktu prosesnya.

Namun, saat melakukan pembandingan, Anda harus berhati-hati terhadap pengalihan konteks. Artinya, proses lain mungkin menggunakan CPU sehingga bersaing untuk CPU dengan tolok ukur Anda dan meningkatkan waktu kerjanya. Untuk menghindari pertikaian dengan proses lain, Anda harus menjalankan tolok ukur seperti ini:

sudo chrt -f 99 /usr/bin/time --verbose <benchmark>

Atau

sudo chrt -f 99 perf stat -ddd <benchmark>

sudo chrt -f 99 menjalankan tolok ukur Anda di kelas FIFO real-time dengan prioritas 99, yang menjadikan proses Anda sebagai proses prioritas utama dan menghindari pengalihan konteks (Anda dapat mengubah /etc/security/limits.conf sehingga tidak memerlukan proses istimewa untuk menggunakan prioritas waktu nyata).

Itu juga membuat time laporkan semua statistik yang tersedia, termasuk jumlah pengalihan konteks yang terjadi pada tolok ukur Anda, yang biasanya bernilai 0, jika tidak, Anda mungkin ingin menjalankan kembali tolok ukur.

perf stat -ddd bahkan lebih informatif daripada /usr/bin/time dan menampilkan informasi seperti instruksi-per-siklus, cabang dan cache yang hilang, dll.

Dan sebaiknya nonaktifkan penskalaan dan peningkatan frekuensi CPU, sehingga frekuensi CPU tetap konstan selama benchmark untuk mendapatkan hasil yang konsisten.


Linux
  1. Nala:Tampilan Depan yang Lebih Cantik untuk Perintah APT

  2. Redirect Output Dari Sebuah Perintah Dalam `time Command`?

  3. Perlu Untuk `builtin` Builtin?

  1. Jadwalkan tugas dengan Linux pada perintah

  2. Panduan terminal Linux untuk pemula

  3. Tidak ada halaman manual untuk perintah cd

  1. 8 tips untuk baris perintah Linux

  2. Temukan Waktu Eksekusi Perintah Atau Proses Di Linux

  3. Unix Less Command:10 Tips untuk Navigasi yang Efektif