[英]Optimizing C++ call from C#
我正在從C#調用兩個C ++函數調用,我的代碼如下。
[DllImport("A.dll", CallingConvention = CallingConvention.StdCall, EntryPoint = "FuncA"), System.Security.SuppressUnmanagedCodeSecurity]
public static extern void FuncA(UInt64 functionID);
在C ++中的代碼是:
EXTERN_C void STDMETHODCALLTYPE FuncA(UINT_PTR functionId)
{
return;
}
從C#到C ++調用此函數的次數約為200萬次。 沒有此功能調用,我的Web請求將在5.9秒內完成。而通過此功能調用,我將獲得7.1秒。
大約15%的開銷。 我已經通過查看帖子使用了“ SuppressUnmanagedCodeSecurity”,將開銷從30%減少到了15%..但是還有其他方法可以減少15%的開銷。
UPDATE1:
對於每個C#函數調用,都需要將函數ID發送到C ++。 C ++函數不是空函數。 它需要將功能ID存儲在STL中,然后另一個線程將對其進行處理。 我正在做.NET探查器之類的事情。 我需要分析每個函數調用。 此FuncA C ++函數將從注入的幫助器函數中調用。
謝謝,
./Rahul
從長遠來看,您可以創建一個托管C ++ CLI靜態庫,該靜態庫調用性能較低的非托管C ++函數,並在C#項目中添加對C ++ / CLI庫的引用。 然后,C#應用程序可以對鏈接的C ++ CLI庫進行托管方法調用,而C ++ CLI庫又可以進行非托管方法調用。 盡管這會導致某種間接影響,但可能會提高性能。
C ++函數做什么? 真的是空方法嗎? 這是您執行動作鏈中的必要步驟嗎?
也許將這種方法重寫為C#以便將其合並到那里的工作流程中更快,而不必調用外部(可能是不安全的)方法。
如果C ++代碼執行的操作與其余流程無關,則也許可以通過讓它在后台工作程序或單獨的線程中運行來贏得一些時間,因此您的C#代碼不必等待代碼運行。 我想這可能是一個有效的選項,因為您的方法返回void。
也許更多有關為什么以及如何幫助我們找到更合適答案的信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.