Tidak diragukan lagi bahwa pengujian merupakan bagian integral dan salah satu aspek terpenting dari proses pengembangan perangkat lunak. Dan dengan menguji, kami tidak bermaksud hanya menguji kode untuk bug - tentu saja, deteksi bug penting karena tidak ada yang ingin perangkat lunak mereka bermasalah - kinerja kode juga sama pentingnya akhir-akhir ini.
Jika dipecah ke bit terakhir, pengujian kinerja secara efektif menguji berapa banyak waktu yang dihabiskan oleh bagian kode tertentu - katakanlah suatu fungsi -. Seperti biasanya, suatu fungsi atau sekelompok fungsi mungkin sesuai dengan salah satu dari banyak fitur perangkat lunak. Jadi, jika melalui pengujian kinerja, kami dapat meningkatkan kinerja fungsi-fungsi ini dalam kode, kinerja perangkat lunak secara keseluruhan menjadi lebih baik.
Jika Anda seorang programmer, yang menulis kode dalam bahasa pemrograman C, Pascal, atau Fortran77 dan menggunakan Linux sebagai platform pengembangan, Anda akan senang mengetahui bahwa ada alat canggih yang dapat digunakan untuk memeriksa kinerja kode Anda - alat yang dimaksud adalah Gprof. Dalam tutorial ini, kita akan membahas detail tentang bagaimana Anda dapat mengunduh, menginstal, dan menggunakan alat ini.
Sebelum kita melanjutkan, harap perhatikan bahwa semua contoh dan instruksi yang disebutkan dalam tutorial ini telah diuji di Ubuntu 14.04LTS dan versi Gprof yang digunakan adalah 2.24.
Apa itu Gprof?
Jadi, apa sebenarnya Gprof itu? Menurut dokumentasi resmi alat ini, ini memberi pengguna profil eksekusi program C, Pascal, atau Fortran77 mereka. Apa yang pada dasarnya dilakukan Gprof adalah menghitung jumlah waktu yang dihabiskan di setiap rutinitas atau fungsi. "Selanjutnya, waktu ini disebarkan di sepanjang tepi grafik panggilan. Siklus ditemukan, dan panggilan ke dalam siklus dibuat untuk berbagi waktu siklus."
Jika semua ini terdengar agak membingungkan pada saat ini (terutama bagian dalam tanda kutip), jangan khawatir, karena kami akan menjelaskannya melalui sebuah contoh. Jadi, baca terus.
Unduh dan Instal Gprof
Pertama-tama periksa apakah alat tersebut sudah terpasang di sistem Anda atau belum. Untuk melakukannya, jalankan perintah berikut di terminal.
$ gprof
Jika Anda mendapatkan kesalahan seperti:
$ a.out: No such file or directory
maka ini berarti alat tersebut sudah terpasang. Jika tidak, Anda dapat menginstalnya menggunakan perintah berikut:
$ apt-get install binutils
Penggunaan Gprof
Tak perlu dikatakan, cara terbaik untuk memahami alat seperti Gprof adalah melalui contoh praktis. Jadi, kita akan memulai dengan program bahasa C, yang akan kita buat profilnya melalui Gprof. Berikut programnya:
//test_gprof.c
#include<stdio.h>
void func4(void)
{
printf("\n Inside func4() \n");
for(int count=0;count<=0XFFFF;count++);
}
void func3(void)
{
printf("\n Inside func3() \n");
for(int count=0;count<=0XFFFFFFF;count++);
}
void func2(void)
{
printf("\n Inside func2() \n");
for(int count=0;count<=0XFFF;count++);
func3();
}
void func1(void)
{
printf("\n Inside func1() \n");
for(int count=0;count<=0XFFFFFF;count++);
func2();
}
int main(void)
{
printf("\n main() starts...\n");
for(int count=0;count<=0XFFFFF;count++);
func1();
func4();
printf("\n main() ends...\n");
return 0;
}
Harap perhatikan bahwa kode yang ditunjukkan di atas (test_gprof.c ) secara khusus ditulis untuk menjelaskan Gprof - ini tidak diambil dari proyek kehidupan nyata mana pun.
Sekarang, lanjutkan, langkah selanjutnya adalah mengkompilasi kode ini menggunakan gcc. Perhatikan bahwa idealnya saya akan mengkompilasi kode di atas menggunakan perintah berikut:
$ gcc -Wall -std=c99 test_gprof.c -o test_gprof
Tetapi karena kami telah membuat profil kode menggunakan Gprof, saya harus menggunakan -pg opsi baris perintah yang disediakan oleh kompiler gcc. Jadi, perintahnya menjadi:
$ gcc -Wall -std=c99 -pg test_gprof.c -o test_gprof
Jika Anda melihat halaman manual gcc, inilah yang dikatakan tentang -pg pilihan:
"Buat kode tambahan untuk menulis informasi profil yang cocok untuk program analisis gprof. Anda harus menggunakan opsi ini saat mengompilasi file sumber yang Anda inginkan datanya, dan Anda juga harus menggunakannya saat menautkan."
Sekarang, kembali ke perintah di atas, setelah berhasil dieksekusi, itu akan menghasilkan biner bernama test_gprof dalam keluaran. Langkah selanjutnya adalah meluncurkan executable itu. Inilah cara saya meluncurkan biner dalam kasus saya:
$ ./test_gprof
Setelah perintah dijalankan, Anda akan melihat file bernama gmon.out akan dihasilkan di direktori kerja saat ini.
$ ls gmon*
gmon.out
Ini adalah file yang berisi semua informasi yang diperlukan alat Gprof untuk menghasilkan data profil yang dapat dibaca manusia. Jadi, sekarang gunakan alat Gprof dengan cara berikut:
$ gprof test_gprof gmon.out > profile-data.txt
Pada dasarnya, sintaks umum dari perintah ini adalah:
$ gprof [executable-name] gmon.out > [name-of-file-that-will-contain-profiling-data]
Sekarang, sebelum kita melihat informasinya, profile-data.txt file berisi, perlu disebutkan bahwa output yang dapat dibaca manusia yang dihasilkan Gprof dibagi menjadi dua bagian:profil datar dan grafik panggilan. Inilah yang dikatakan halaman manual Gprof tentang informasi di bawah dua bagian ini:
"Profil datar menunjukkan berapa banyak waktu yang dihabiskan program Anda di setiap fungsi, dan berapa kali fungsi itu dipanggil. Jika Anda hanya ingin mengetahui fungsi mana yang menghabiskan sebagian besar siklus, ini dinyatakan secara ringkas di sini."
"Grafik panggilan menunjukkan, untuk setiap fungsi, fungsi mana yang memanggilnya, fungsi lain yang dipanggil, dan berapa kali. Ada juga perkiraan berapa banyak waktu yang dihabiskan di subrutin setiap fungsi. Ini dapat menyarankan tempat di mana Anda mungkin mencoba untuk menghilangkan panggilan fungsi yang menghabiskan banyak waktu."
Berbekal informasi ini, sekarang Anda akan berada dalam posisi yang lebih baik untuk memahami data yang ada dalam file keluaran profil Anda (profile-data.txt dalam hal ini). Inilah profil datar dalam kasus saya:
Flat profile:
Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls ms/call ms/call name
96.43 0.81 0.81 1 810.00 810.00 func3
3.57 0.84 0.03 1 30.00 840.00 func1
0.00 0.84 0.00 1 0.00 810.00 func2
0.00 0.84 0.00 1 0.00 0.00 func4
Dan inilah arti setiap bidang:
Selanjutnya, inilah grafik panggilan dalam kasus saya:
Call graph (explanation follows)
granularity: each sample hit covers 4 byte(s) for 1.19% of 0.84 seconds
index % time self children called name
0.03 0.81 1/1 main [2]
[1] 100.0 0.03 0.81 1 func1 [1]
0.00 0.81 1/1 func2 [3]
-----------------------------------------------
<spontaneous>
[2] 100.0 0.00 0.84 main [2]
0.03 0.81 1/1 func1 [1]
0.00 0.00 1/1 func4 [5]
-----------------------------------------------
0.00 0.81 1/1 func1 [1]
[3] 96.4 0.00 0.81 1 func2 [3]
0.81 0.00 1/1 func3 [4]
-----------------------------------------------
0.81 0.00 1/1 func2 [3]
[4] 96.4 0.81 0.00 1 func3 [4]
-----------------------------------------------
0.00 0.00 1/1 main [2]
[5] 0.0 0.00 0.00 1 func4 [5]
Tangkapan layar berikut menjelaskan grafik panggilan informasi yang berisi:
Jika Anda bertanya-tanya tentang sumber tangkapan layar di atas, izinkan saya memberi tahu Anda bahwa semua informasi ini ada di file keluaran yang berisi informasi profil, termasuk profil datar dan grafik panggilan. Jika Anda ingin informasi ini dihilangkan dari output, Anda dapat menggunakan -b opsi yang disediakan oleh Gprof.
Kesimpulan
Tak perlu dikatakan, kami baru saja menggaruk permukaan di sini, karena Gprof menawarkan banyak fitur (lihat saja halaman manualnya). Namun, apa pun yang telah kami bahas di sini seharusnya cukup untuk membantu Anda memulai. Jika Anda sudah menggunakan Gprof, dan ingin berbagi sesuatu yang terkait dengan alat ini dengan semua orang di sini, cukup beri komentar di bawah.