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.