在嘗試反覆比較Cgo 和純Go 函數的執行時間時,測試人員遇到了意想不到的結果。 Cgo 函數花費的時間明顯長於 Golang 函數,導致混亂和對測試程式碼的探索。
下面提供的測試程式碼比較了Cgo 的執行時間和純Go 函數,每個執行一億次:
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) }
從測試程式碼得到的結果顯示,呼叫C函數明顯慢於Go函數。這就引發了測試程式碼本身是否有缺陷的問題。
雖然提供的測試程式碼有效,但 Cgo 固有的效能限制導致了Cgo 函數的執行時間較慢。
透過 Cgo 呼叫 C/C 程式碼會產生相對較高的開銷,通常最小化這些 CGo 呼叫 受到推崇的。在這種特殊情況下,將迴圈移至 C,而不是從 Go 重複呼叫 CGo 函數可能會提高效能。
此外,CGo 採用單獨的執行緒設定來執行 C 程式碼,對程式碼的執行情況做出某些假設行為。其中一些假設可能會導致效能影響:
CGo 的角色應該主要被視為與現有庫接口的網關,可能帶有額外的小型 C 包裝函數來減少 Go 的調用數量。透過 CGo 進行類別 C 效能最佳化的期望通常無法滿足,因為等效 C 和 Go 程式碼之間的效能差距已經較小。
以上是為什麼我的 Cgo 函數比我的等效 Go 函數慢很多?的詳細內容。更多資訊請關注PHP中文網其他相關文章!