首頁 >後端開發 >Golang >為什麼我的 Cgo 函數比我的等效 Go 函數慢很多?

為什麼我的 Cgo 函數比我的等效 Go 函數慢很多?

DDD
DDD原創
2024-12-04 01:27:09742瀏覽

Why Is My Cgo Function So Much Slower Than My Equivalent Go Function?

為什麼Cgo 的效能慢得令人費解:檢查一個測試案例

在嘗試反覆比較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(&amp;input)
}

意外結果與求索解答

從測試程式碼得到的結果顯示,呼叫C函數明顯慢於Go函數。這就引發了測試程式碼本身是否有缺陷的問題。

深入探討 Cgo 的效能挑戰

雖然提供的測試程式碼有效,但 Cgo 固有的效能限制導致了Cgo 函數的執行時間較慢。

透過 Cgo 呼叫 C/C 程式碼會產生相對較高的開銷,通常最小化這些 CGo 呼叫 受到推崇的。在這種特殊情況下,將迴圈移至 C,而不是從 Go 重複呼叫 CGo 函數可能會提高效能。

此外,CGo 採用單獨的執行緒設定來執行 C 程式碼,對程式碼的執行情況做出某些假設行為。其中一些假設可能會導致效能影響:

  • Go 中的 Goroutines 使用相對較小的堆疊並動態處理堆疊成長。
  • CGo 的執行緒處理可能會幹擾 libpthread 的執行緒本地儲存實作。
  • Go 的UNIX 訊號處理程序可能會破壞傳統的C 或C
  • 如果C 程式碼參與阻塞系統呼叫或獨佔線程,則為多個Goroutines 重複使用作業系統線程可能會產生負面後果。

結論

CGo 的角色應該主要被視為與現有庫接口的網關,可能帶有額外的小型 C 包裝函數來減少 Go 的調用數量。透過 CGo 進行類別 C 效能最佳化的期望通常無法滿足,因為等效 C 和 Go 程式碼之間的效能差距已經較小。

以上是為什麼我的 Cgo 函數比我的等效 Go 函數慢很多?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn