Dalam percubaan untuk membandingkan masa pelaksanaan Cgo dan fungsi Go tulen berulang kali, penguji menemui hasil yang tidak dijangka . Fungsi Cgo mengambil masa yang jauh lebih lama daripada fungsi Golang, yang membawa kepada kekeliruan dan penerokaan ke dalam kod ujian.
Kod ujian yang disediakan di bawah membandingkan masa pelaksanaan untuk Cgo dan fungsi Go tulen, setiap satunya dilaksanakan 100 juta kali:
import ( "fmt" "time" ) /* #include <stdio.h> #include <stdlib.h> #include <string.h> void show() { } */ // #cgo LDFLAGS: -lstdc++ import "C" //import "fmt" func show() { } func main() { now := time.Now() for i := 0; i < 100000000; i = i + 1 { C.show() } end_time := time.Now() var dur_time time.Duration = end_time.Sub(now) var elapsed_min float64 = dur_time.Minutes() var elapsed_sec float64 = dur_time.Seconds() var elapsed_nano int64 = dur_time.Nanoseconds() fmt.Printf("cgo show function elasped %f minutes or \nelapsed %f seconds or \nelapsed %d nanoseconds\n", elapsed_min, elapsed_sec, elapsed_nano) now = time.Now() for i := 0; i < 100000000; i = i + 1 { show() } end_time = time.Now() dur_time = end_time.Sub(now) elapsed_min = dur_time.Minutes() elapsed_sec = dur_time.Seconds() elapsed_nano = dur_time.Nanoseconds() fmt.Printf("go show function elasped %f minutes or \nelapsed %f seconds or \nelapsed %d nanoseconds\n", elapsed_min, elapsed_sec, elapsed_nano) var input string fmt.Scanln(&input) }
Keputusan yang diperoleh daripada kod ujian menunjukkan bahawa menggunakan fungsi C adalah lebih perlahan daripada fungsi Go. Ini membawa kepada persoalan sama ada terdapat sebarang kecacatan dalam kod ujian itu sendiri.
Walaupun kod ujian yang diberikan adalah sah, had prestasi yang wujud Cgo menyumbang kepada masa pelaksanaan yang lebih perlahan diperhatikan untuk fungsi Cgo.
Panggilan kod C/C melalui Cgo menimbulkan kod yang agak tinggi overhed, dan meminimumkan panggilan CGo ini biasanya disyorkan. Dalam senario khusus ini, mengalihkan gelung ke C dan bukannya berulang kali menggunakan fungsi CGo daripada Go berpotensi meningkatkan prestasi.
Selain itu, CGo menggunakan persediaan benang berasingan untuk melaksanakan kod C, membuat andaian tertentu tentang kod tingkah laku. Beberapa andaian ini boleh membawa kepada kesan prestasi:
Peranan CGO sepatutnya dilihat terutamanya sebagai pintu masuk ke antara muka dengan perpustakaan sedia ada, berpotensi dengan tambahan fungsi pembalut C kecil untuk mengurangkan bilangan panggilan dibuat daripada Go. Jangkaan pengoptimuman prestasi seperti C melalui CGo biasanya tidak dipenuhi, kerana jurang prestasi sudah berkurangan antara kod C dan Go yang setara.
Atas ialah kandungan terperinci Mengapa Fungsi Cgo Saya Jauh Lebih Lambat Daripada Fungsi Go Setara Saya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!