2 回答

TA貢獻(xiàn)1825條經(jīng)驗(yàn) 獲得超6個(gè)贊
Cgo 相當(dāng)慢,因?yàn)?Go 必須以某些方式擾亂它的運(yùn)行時(shí)和調(diào)用約定來(lái)調(diào)用 C 函數(shù)。唯一真正值得的地方是計(jì)算時(shí)間顯著使成本相形見(jiàn)絀的情況。它類(lèi)似于并行、分布式、GPU 等編程,盡管啟動(dòng)成本略低。
匯編要好得多,因?yàn)槟梢跃帉?xiě)使用 Go 調(diào)用約定的匯編,并且在其他方面被視為本機(jī) Go 代碼,但匯編的可移植性要低得多,更難閱讀,維護(hù)也更繁重。事實(shí)上,Go 標(biāo)準(zhǔn)庫(kù)以 Plan 9 樣式的程序集編寫(xiě)了一些math
和big
包。
Gonum就是這兩者的一個(gè)例子。它對(duì)一些可以通過(guò)這種方式更快完成的功能使用通用程序集,但它也利用了 blas 和 lapack 引擎。它確實(shí)提供了一個(gè)Go-blas
實(shí)現(xiàn),但是 C-blas(通常最終是 Fortran-blas)更快,并且對(duì)于大型矩陣計(jì)算,幾乎總是使離開(kāi) Go 的成本相形見(jiàn)絀。
通常,您希望盡可能避免使用 cgo。僅在需要大量計(jì)算時(shí)間時(shí)使用它,或者您需要與在純 Go 中無(wú)法進(jìn)行交互的事物進(jìn)行交互,例如圖形或音頻驅(qū)動(dòng)程序,或訪問(wèn) OpenCV 等通用庫(kù)。即便如此,如果您真的關(guān)心性能,那么在可能的情況下,實(shí)現(xiàn)某種“調(diào)用池”可能是值得的,您可以在其中安排來(lái)自 Go 端的多個(gè)調(diào)用,并通過(guò)單個(gè)上下文切換到 C 來(lái)一次執(zhí)行它們。
編輯:至于 C++,有一些重大問(wèn)題。如果沒(méi)有幾個(gè)抽象層,可能很難包裝某些庫(kù)(因?yàn)?cgo 無(wú)法正確處理包含的 C++ 頭文件)。此外,帶有析構(gòu)函數(shù)的 C++ 類(lèi)不能真正按值返回,必須在堆上分配。由于 Go 不允許資源的確定性終結(jié),因此您必須提供顯式釋放內(nèi)存的函數(shù),并且 Go 用戶(hù)必須記住釋放資源。(您可能會(huì)在名為的文檔中讀到一個(gè)函數(shù),runtime.SetFinalizer
但我不能說(shuō)我見(jiàn)過(guò)有人使用它,而且文檔本身帶有很多警告)
諸如此類(lèi)的功能defer
使這更易于管理,但它破壞了許多諸如 RAII 之類(lèi)的東西,這些東西使現(xiàn)代 C++ 實(shí)踐更安全。

TA貢獻(xiàn)1812條經(jīng)驗(yàn) 獲得超5個(gè)贊
除非 C 庫(kù)在一次調(diào)用中完成大量工作,否則我不會(huì)僅僅為了性能而編寫(xiě) C 代碼。我認(rèn)為 cgo 僅用于與舊代碼交互。
原因是 cgo 開(kāi)銷(xiāo)。目前對(duì) cgo 函數(shù)的函數(shù)調(diào)用比對(duì) Go 代碼的函數(shù)調(diào)用慢 50 到 100 倍。cgo 函數(shù)調(diào)用的開(kāi)銷(xiāo)是驚人的。
- 2 回答
- 0 關(guān)注
- 324 瀏覽
添加回答
舉報(bào)