2009-12-07 88 views
1

我很早就開始使用純C語言,然後轉到C++,現在我正面臨C++/CLI。作爲一個性能怪胎,我總是試圖將最後一滴性能壓縮到每一行代碼。我目前正在一個項目中合理地完成VB.Net(簡單性,資源可用性等),但有幾點非常敏感,我打算在C++/CLI中執行這些部分。但是,只有一小部分可以從託管代碼中取出,而其餘部分則需要保持管理。問題是,與C#或VB.Net相比,編寫C++/CLI託管函數是否會帶來性能上的提升?從我讀過的文檔中我可以理解的,唯一的好處似乎是託管/非託管thunk更輕。是這樣嗎?因爲我甚至不能似乎能夠存儲在非託管數組或結構手柄(我可以操縱更快),如:C++/CLI性能增益

String^mystr = "Oh, my!"; 
Object^myarray[10]; 
myarray[0] = mystr; // Can't event be casted to void*, int, HANDLE... 
// (however, handles do have a sizeof() == 4 in Win32) 
// (I don't expect the handle to behave like a pointer; just stay as handle) 

回答

0

使用C++/CLI可以看到的唯一性能提升是混合本機代碼和託管代碼的地方。 C++/CLI允許您以比VB.Net更少的開銷調用性能關鍵部分代碼的本機方法。我不會建議在本地和本地之間進行切換,因爲仍然存在懲罰,但將控制權交給本地代碼以處理大量與性能相關的代碼是可以接受的。

+0

謝謝。雖然我仍然需要描述它的實際開銷是多少,但我知道有關開銷。 – 2009-12-07 18:59:08

1

有沒有性能上的優勢作爲C++/CLI編譯成MSIL,就像C#和VB 。淨。你可以在VB和C++/CLI中編寫一些簡單的測試函數來自己看看。

+0

在這一點上,這是各自編譯器的問題。 C++團隊可能傾向於比C#或VB.NET團隊更努力地工作。 – 2009-12-09 15:56:13

+0

的確如此,但我認爲C++/CLI團隊是所有團隊中最小的。他們在VS 2010中甚至沒有用於C++/CLI的Intellisense。所以我不認爲該團隊正在努力將C++優化爲MSIL編譯,或者至少比C#或VB團隊更重要。 – Eric 2009-12-09 17:46:21

+0

說這沒什麼好處是不對的。它們可能不適用於所有設計,但在某些情況下,它們具有非常顯着的優勢。 – 2012-11-19 04:30:47

3

我是一個表現欲太強了,我已經瞭解到,

  1. 這類問題不是我甚至問,直到我知道那裏的性能問題,

  2. 一旦我知道它們在哪裏,我不需要問,因爲我可以很容易地發現,因爲a)所有編譯的語言生成彙編或中間語言,我可以看看,和b)我可以運行它10^6次只是時鐘而已。

我的經驗是有多個性能問題,有一系列的尺寸。首先,我修復那些最容易/最大的。這使得其餘的人佔用更大的時間百分比,所以他們更容易找到下一步。**

I keep doing tuning passes until I run out of performance problems I can fix. 到那時代碼可以比開始的方式更快。

**示例:假設程序需要10秒鐘。假設有兩個問題(你直到你看不到),他們分別佔50%和30%。你修好第一個,時間下降到5秒。現在第二個問題是消耗60%,因爲總時間減少了,所以更容易發現。修復它,時間下降到2秒 - 5倍加速。存在的問題越多,可能的加速越戲劇化。人們可能會懷疑他們有這麼大的問題,如果是的話,抽樣會證明或反駁它。

+0

謝謝,邁克。但是,這與我的問題無關。 – 2009-12-08 03:34:10

+0

Upvoted提供一個有效的點。 – 2014-08-22 11:29:08

3

C++/CLI被管理 - 它被編譯成與其他.net語言相同的MSIL。如果速度對你來說是最重要的,那麼在本地dll中寫入關鍵位並從你的vb.net應用程序中扣除它(保持thunk count不變,你應該沒問題)。

雖然tbh,id首先檢查代碼是否真的有必要,而不僅僅是過早的優化。無論如何,MSIL可以被編譯成本地代碼 - 真正的問題是.net JITer是否像原生c/C++編譯器一樣優化。

0

雖然C++/CLI編譯器可能無法爲代碼的直接轉換提供更好的性能,但有許多C++功能甚至可以在託管代碼中提供巨大的性能優勢。

一個很大的模板。該代碼被重新生成並針對每個模板參數組合進行獨立優化。儘管.NET泛型通常會抑制最微不足道的內聯,但轉換爲C++/CLI模板可以提供額外的優化機會,以及在任何其他.NET語言中都沒有任何等價物的專業化和編譯時元程序。

0

性能增益來自將非託管代碼與託管程序集混合使用。 C++/cli使這非常簡單。嘗試通過c#或vb.net調用C++ pinvoke ...你必須將C++包裝在extern c調用中,或者通過調用C++來調用C++。此外,您還可以從優化的Microsoft C++編譯器中獲得相當不錯的性能收益。如果你不混合非託管代碼,那麼就沒有性能增益,因爲它像其他人提到的那樣編譯爲MSIL。