第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

在 Go 應(yīng)用程序中使用 C(++) 來(lái)提高性能

在 Go 應(yīng)用程序中使用 C(++) 來(lái)提高性能

Go
溫溫醬 2022-01-17 20:05:21
幾天前我開(kāi)始學(xué)習(xí) Go,并通過(guò)它的 CGO 和 gccgo 編譯器來(lái)學(xué)習(xí)。據(jù)我了解,這允許 Go 程序使用 Go 編譯器進(jìn)行編譯,并使用 C 編譯器編譯 C 庫(kù),并從 Go 程序內(nèi)部引用這些庫(kù)。這對(duì)我來(lái)說(shuō)真的很有趣,因?yàn)檫@使我們能夠以很少的開(kāi)銷(xiāo)從主程序中利用 C 的性能(如果需要)。但是我不確定那有多少,所以我在這里問(wèn):在某些情況下,您會(huì)創(chuàng)建一個(gè) C 庫(kù)只是為了在您的 Go 應(yīng)用程序中使用它?或者這個(gè)特性只是為了促進(jìn)現(xiàn)有 C 代碼的可重用性?PS:我認(rèn)為目前 CGO 不支持 C++,但這里有一個(gè)帖子,有人能夠使用 C 函數(shù)包裝 C++ 代碼并成功調(diào)用它們。
查看完整描述

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ě)了一些mathbig包。

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í)踐更安全。


查看完整回答
反對(duì) 回復(fù) 2022-01-17
?
慕雪6442864

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)是驚人的。


查看完整回答
反對(duì) 回復(fù) 2022-01-17
  • 2 回答
  • 0 關(guān)注
  • 324 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)