Perintah time Linux: waktu berlalu, CPU, dan GNU Time
time mengukur waktu yang berlalu dan waktu penggunaan CPU untuk sebuah perintah atau pipeline. Kata kunci time di Bash dapat mengukur perintah bawaan shell, fungsi, dan pipeline, sementara /usr/bin/time eksternal GNU dapat memberikan penggunaan sumber daya secara rinci seperti memori dan I/O.
Untuk pemeriksaan kecepatan sederhana, Bash time nyaman digunakan, dan jika Anda memerlukan statistik tingkat sistem operasi seperti memori maksimum dan kesalahan halaman, lebih baik menjalankan time eksternal secara eksplisit.
Apa itu perintah time?
Di Bash, time adalah kata kunci yang dikenali sebagai sintaks sebelum file eksekusi biasa. Karena ini adalah kata kunci, secara alami bisa mengukur tidak hanya satu program eksternal tetapi juga seluruh pipeline, fungsi shell, dan perintah bawaan.
Banyak sistem Linux juga memiliki executable GNU Time yang terpasang secara terpisah. Meskipun memiliki nama yang sama, opsi dan informasi keluaran berbeda, jadi periksa lingkungan Anda saat ini dengan perintah berikut.
type -a time
command -V time
ls -l /usr/bin/time
Sintaks dasar Bash time
time [-p] command [arguments...]
time [-p] command1 | command2
Letakkan time sebelum perintah yang ingin Anda ukur.
time sleep 1
time find /usr -type f >/dev/null
Ketika perintah selesai, biasanya tiga nilai real, user, dan sys ditampilkan.
Arti dari real, user, sys
| Item | Makna |
|---|---|
real |
Waktu yang sebenarnya telah berlalu dari mulai hingga selesai. Ini juga termasuk waktu yang dihabiskan menunggu karena disk, keterlambatan jaringan, dan proses lainnya. |
user |
Waktu kumulatif yang telah digunakan proses pada CPU dalam mode pengguna. |
sys |
Waktu CPU kumulatif yang digunakan dalam mode kernel untuk proses. |
Jika beberapa inti atau proses digunakan secara paralel, user + sys bisa lebih besar daripada real. Sebaliknya, jika waktu tunggu I/O panjang, real bisa besar sementara waktu CPU kecil.
Mengukur seluruh pipeline
Kata kunci terreserved di Bash time mengukur hingga seluruh pipeline berikut selesai.
time find /var/log -type f -print0 | xargs -0 wc -l >/dev/null
Jika Anda ingin mengukur hanya perintah pertama dari sebuah pipeline secara terpisah, Anda perlu mengatur grup dengan jelas atau berhati-hati dengan cakupan pengukuran saat menggunakan alat eksternal. Penting untuk terlebih dahulu menentukan titik awal dan akhir dari tugas yang ingin Anda ukur.
Mengukur Beberapa Perintah sebagai Satu Tugas
Contoh berikut memerlukan proyek dengan Makefile dan target yang sesuai. Jalankan hanya dalam direktori proyek yang hendak dibangun, karena make clean dapat menghapus hasil build. Operator && mencegah langkah berikutnya berjalan jika langkah awal gagal.
time {
make clean &&
make -j4
}
time (
cd /srv/app &&
./build.sh
)
Kelompok kurung kurawal berjalan di shell saat ini, sedangkan kelompok tanda kurung berjalan di subshell. Perhatikan perbedaan ini jika direktori atau variabel berubah selama tugas.
Format Output Portabel -p
time -p sleep 1
-p menggunakan output real, user, sys gaya POSIX. Ini berguna ketika Anda perlu hanya mem-parsing hasil di beberapa sistem, tetapi kebutuhan otomatis termasuk lokal dan presisi perlu dipertimbangkan secara terpisah.
Mengubah Output Bash dengan TIMEFORMAT
Output dari kata kunci Bash dapat disesuaikan menggunakan variabel TIMEFORMAT.
(
TIMEFORMAT='elapsed=%3R s user=%3U s sys=%3S s'
time sleep 1
)
| Format | Makna |
|---|---|
%R |
Waktu yang telah berlalu |
%U |
Waktu CPU dalam mode pengguna |
%S |
Waktu CPU dalam mode sistem |
%P |
Tampilkan penggunaan CPU sebagai persentase |
%% |
Tanda persen literal |
TIMEFORMAT memengaruhi shell saat ini. Untuk menerapkannya sementara, pertahankan nilai yang ada atau atur di dalam subshell.
(
TIMEFORMAT='elapsed=%R s'
time ./job.sh
)
Gunakan GNU time eksternal
Tentukan jalur lengkap untuk menggunakan opsi GNU Time; pastikan /usr/bin/time memang GNU Time. Untuk latihan berikut, simpan isi ini sebagai job.sh di direktori uji baru. Skrip hanya mencetak pesan dan menunggu satu detik; gunakan bash job.sh sehingga tidak memerlukan izin eksekusi.
#!/usr/bin/env bash
printf '%s\n' 'Pekerjaan dimulai.'
printf '%s\n' 'Pesan diagnostik contoh.' >&2
sleep 1
Jalankan /usr/bin/time bash job.sh atau /usr/bin/time -v bash job.sh. Pesan pertama muncul di keluaran standar; pesan diagnostik dan laporan waktu muncul di kesalahan standar. Contoh lain yang memakai ./job.sh memerlukan file ini diberi izin eksekusi dengan chmod u+x job.sh.
-v menampilkan informasi rinci yang disediakan oleh sistem, seperti memori residensial maksimum, kesalahan halaman, I/O sistem file, dan pergantian konteks. Item dan nilai yang sebenarnya disediakan dapat bervariasi tergantung pada sistem operasi.
Opsi yang sering digunakan dari GNU time
| Opsi | Deskripsi |
|---|---|
-p |
Mencetak waktu dalam format POSIX. |
-v |
Mencetak statistik penggunaan sumber daya secara rinci. |
-f FORMAT |
Memformat keluaran menggunakan spesifikasi format. |
-o FILE |
Menulis hasil pengukuran ke file yang ditentukan. |
-a |
Dengan -o, menambahkan laporan ke file tanpa menimpanya. |
Keluarkan hanya waktu dan memori dalam format yang diinginkan
/usr/bin/time -f 'elapsed=%e max_rss=%MKB' ./job.sh
%e adalah waktu berlalu dalam detik, sedangkan %M adalah ukuran maksimum memori residen (RSS) dalam kilobita menurut GNU Time. Ini bukan ukuran rata-rata, ukuran heap, atau bukti kebocoran memori. Metrik yang tidak didukung sistem dapat dilaporkan sebagai nol.
Simpan hasil pengukuran ke dalam file
/usr/bin/time -v -o time-report.txt ./job.sh
/usr/bin/time -v -a -o time-report.txt ./job.sh
-o menyimpan laporan waktu dan menimpa file laporan yang sudah ada; -a menambahkan laporan tanpa menimpanya. Kesalahan standar pekerjaan tetap terpisah dan tidak otomatis masuk ke file laporan. Gunakan direktori latihan baru agar tidak menimpa laporan penting.
Mengapa keluaran waktu dikirim ke kesalahan standar
Informasi waktu secara default dikirim ke kesalahan standar. Ini untuk mencegah hasil waktu bercampur dengan keluaran standar perintah ketika diarahkan atau dialihkan ke file.
time ./job.sh >job-output.txt
Perintah ini menyimpan keluaran standar pekerjaan ke file; laporan waktu tetap menuju kesalahan standar, biasanya terminal. Pengalihan pada seluruh grup berikut juga menangkap diagnostik pekerjaan. Jalankan di direktori latihan karena file keluaran yang sudah ada dapat ditimpa.
{ time ./job.sh >job-output.txt; } 2>time-and-errors.txt
Untuk memisahkan hanya laporan waktu, menggunakan GNU Time -o eksternal lebih jelas.
Poin yang perlu diperhatikan untuk perbandingan yang akurat
- Eksekusi pertama dan eksekusi berikutnya mungkin berbeda karena caching sistem file, kompilasi JIT, dan penggunaan kembali koneksi.
- Kontrol beban latar, penskalaan frekuensi CPU, dan persaingan sumber daya mesin virtual.
- Perintah yang sangat singkat mungkin memiliki hasil yang sangat dipengaruhi oleh overhead pengukuran itu sendiri.
- Ulangi beberapa kali dan bandingkan median atau distribusinya.
- Waktu eksekusi mungkin bervariasi tergantung pada apakah target output adalah terminal atau file.
- Periksa juga apakah perbedaan kecepatan benar-benar mengubah hasil tugas atau tingkat kesalahan.
Perbandingan antara waktu Bash dan /usr/bin/time
| Kategori | Bash time |
GNU /usr/bin/time |
|---|---|---|
| Jenis | Kata Kunci Bash | File Eksekusi Eksternal |
| Saluran Pipa | Sangat mudah untuk mengukur seluruh saluran pipa secara langsung. | Secara default, ini menjalankan program yang ditentukan. |
| Fungsi Shell dan Perintah Bawaan | Dapat diukur secara langsung. | Sulit dijalankan secara langsung tanpa melalui shell terpisah. |
| Informasi Sumber Daya Terperinci | Ini berfokus pada statistik waktu dasar. | Menggunakan -v memberikan statistik seperti memori dan I/O. |
| Kustomisasi Output | TIMEFORMAT |
-f, -o, -a |
Pertanyaan yang Sering Diajukan
Apakah waktu pengguna bisa lebih besar dari waktu nyata?
Ya. Jika waktu CPU yang digunakan di berbagai proses atau inti CPU terakumulasi, waktu CPU pengguna bisa lebih besar dari waktu yang sebenarnya berlalu.
time -v tidak bekerja.
Ini bisa terjadi karena kata cadangan Bash diinterpretasikan terlebih dahulu. Jika GNU Time terinstal, gunakan jalur lengkap seperti /usr/bin/time -v command.
Apakah time mengubah status keluar dari sebuah perintah?
Biasanya mengembalikan status keluar dari perintah atau pipeline yang diukur. Dalam sebuah pipeline, hasilnya bisa berbeda tergantung pada pengaturan pipefail Bash.




