2011-09-30 180 views
5

我有一個win32 dll和兩個使用相同dll的應用程序。一個是在非託管空間中使用c編寫的,另一個是使用Pinvokes調用非託管代碼的.net應用程序。從託管代碼調用非託管代碼的性能

有時,.net應用程序的性能比c應用程序更好。從技術上說,從.net調用非託管代碼會導致性能開銷,但在這種情況下不會。

我檢查了msdn參考,似乎有一些預先處理髮生在實際調用之前。在鏈接期間,dll被加載。

我想了解在什麼情況下.net應用程序的表現優於?

+2

您如何衡量兩個應用程序的性能,並且兩者的所有其他邏輯完全相同? –

+1

通常,本機調用應該更快,看看這個:http://www.codeproject.com/KB/dotnet/pinvokeperformance.aspx你確定你的測量是正確的嗎? –

+0

@AvadaKedavra - 我分別使用秒錶和時間測量了.net和c應用程序的特定方法調用。 – sundar

回答

5

pinvoke編組器是.NET框架中最重優化的代碼塊之一。非常重要的是,在非託管操作系統上運行託管程序時,您看不到很多難以辨認的內容。開銷的數額變化很大。當DLL已經被加載並且pinvoked函數的參數是簡單整型時,它只是少數cpu循環。當需要進行字符串轉換時,需要數百個週期。

在任何情況下,它都不會比原生電話快。精確測量只有少數幾個週期的開銷是困難的。並且請記住,您可能會無意中測量測試程序的性能而不是撥打電話。