Software Profiling
Dalam mengembangkan suatu perangkat lunak, profiling adalah pengukuran untuk analisis program secara dinamis misalnya kompleksitas waktu atau memori yang digunakan, banyaknya function call dan sebagainya. Profiling umumnya dilakukan dengan tujuan membuat program lebih optimal.
Dalam menggunakan Golang, terdapat tools pprof yang dapat digunakan untuk profiling. Pertama, profiling perlu di-enable pada program yang akan kita lakukan profiling dengan menambahkan kode berikut:
var cpuprofile = flag.String("cpuprofile", "", "write cpu profile to file")
func main() {
flag.Parse()
if *cpuprofile != "" {
f, err := os.Create(*cpuprofile)
if err != nil {
log.Fatal(err)
}
pprof.StartCPUProfile(f)
defer pprof.StopCPUProfile()
}
...
Selanjutnya ketika menjalankan binary program, kita bisa menambahkan flag -cpuprofile
: (contoh file binary program bernama havlak1
)
./havlak1 -cpuprofile=havlak1.prof
Selanjutnya pprof akan menyediakan antarmuka interaktif melalui terminal:
# of loops: 76000 (including 1 artificial root node)
$ go tool pprof havlak1 havlak1.prof
Welcome to pprof! For help, type 'help'.
(pprof)
Fungsi yang sering digunakan adalah topN untuk mengurutkan function program berdasarkan banyak sample. Sample memberikan gambaran seberapa berpengaruh suatu function:
(pprof) top10
Total: 2525 samples
298 11.8% 11.8% 345 13.7% runtime.mapaccess1_fast64
268 10.6% 22.4% 2124 84.1% main.FindLoops
251 9.9% 32.4% 451 17.9% scanblock
178 7.0% 39.4% 351 13.9% hash_insert
131 5.2% 44.6% 158 6.3% sweepspan
119 4.7% 49.3% 350 13.9% main.DFS
96 3.8% 53.1% 98 3.9% flushptrbuf
95 3.8% 56.9% 95 3.8% runtime.aeshash64
95 3.8% 60.6% 101 4.0% runtime.settype_flush
88 3.5% 64.1% 988 39.1% runtime.mallocgc
Kolom pertama dan kedua menunjukkan jumlah sample dimana function berjalan, kolom ketiga ada kumulatif dari kolom kedua. Kolom keempat dan kelima menunjukkan jumlah sample dimana function muncul (termasuk sedang berjalan atau menunggu function lain). Untuk mengurutkan berdasarkan kolom keempat dan kelima dapat menggunakan flag -cum
:
(pprof) top5 -cum
Total: 2525 samples
0 0.0% 0.0% 2144 84.9% gosched0
0 0.0% 0.0% 2144 84.9% main.main
0 0.0% 0.0% 2144 84.9% runtime.main
0 0.0% 0.0% 2124 84.1% main.FindHavlakLoops
268 10.6% 10.6% 2124 84.1% main.FindLoops
Selain itu pprof juga menyediakan visualisasi function call dengan bantuan graphviz yang dapat dilihat dengan perintah:
(pprof) web
Dengan informasi yang disediakan profiling, kita dapat tau function mana yang lebih berdampak bila kita optimisasi.