2012-05-18 43 views
-4

所以現在就是這種情況: 我在同一個解決方案中將C#GUI項目與C#Engine項目組合在一起。 GUI允許與用戶交互,一些高級別的東西等。引擎的功能是與另一個第三方應用程序通信。該引擎具有連接到第三方應用程序的套接字,並具有將消息轉換爲對象,將其發送給第三方應用程序以及偵聽來自第三方應用程序的響應並作出相應反應的方法。要在Engine和第三方應用程序之間傳輸的數據打包到對象中。 C#引擎的問題是它太慢了。所以我們的想法是將引擎轉換爲非託管C++以提高速度。 這是我的進攻計劃:將C#引擎轉換爲C++以提高速度

  1. 由專人翻譯整個C#引擎成C++(這已經是相當艱鉅的,因爲C#引擎包括線程和哈希表)
  2. 有以下來替代構造,存取,和修改器在C++:

    void* CreateInstance() 
    { 
        MyClass* p = new MyClass(); 
        return p; 
    } 
    
    void ReleaseInstance(void* pInstance) 
    { 
        MyClass* p = (MyClass*)pInstance; 
        delete p; 
    } 
    
    int GetData(void* pInstance) 
    { 
        MyClass* p = (MyClass*)pInstance; 
        return p->GetData(); 
    } 
    
    void SetData(void* pInstance, value) 
    { 
        MyClass* p = (MyClass*)pInstance; 
        p->SetData(value); 
    } 
    

    (爲什麼我不能在C++中使用真實類的原因是因爲你不能實例在C#C++對象)

  3. 然後構建一個C++非託管DLL,在C#GUI項目([DllImport等])中使用P/Invoke來訪問所有C++方法,並用它來替換C#引擎。對象將使用方法進行模擬,並在C#GUI和C++ Engine之間來回傳遞。

之前,我走上這個耗時的任務,有沒有C#代碼,就不可能轉化爲C++,然後重新導入回C#GUI通過這種方法?

+2

這看起來非常容易出錯,而且根本不好玩。另外,你這樣做的理由似乎是錯誤的。 – Pubby

+9

您是否嘗試過實際分析您的C#引擎?我不明白在大多數情況下用一種不同的語言重新編寫的東西是否值得編排開銷。如果您的C#代碼使用線程,因爲它同步使用套接字,那麼您的代碼很差,與編寫的語言是正交的。 – ildjarn

+0

與固定C#代碼相比,將受管理值封送到本地和返回的性能損失如何?我不確定CLR比本地代碼慢很多,因此用C++重寫某些東西將是一個合理的解決方案。除非您的託管代碼將託管類型大量編組爲本機類型。 –

回答

2

沒有任何C#代碼不可能轉換成C++。不過,您可能想了解一下,.NET中是否有任何庫函數未包含在您將要使用的C++庫中。確保你沒有被任何車輪卡住而重新發明。

這就是說,在我的實踐經驗中,真實世界的C++代碼並不比現實世界的C#代碼更快。確實,C++程序員有更多可用的技巧可以讓他們獲得更好的性能,但涉及到這一點的努力往往是相當艱鉅的。考慮着名的案例competition between Rico Mariani and Raymond Chen。 Chen最終版本享受Rico's的優勢最​​終歸功於.NET運行時引導自己的時間。這對於長時間運行的流程而言可以忽略不計。

因此,我強烈建議您嘗試花一些時間與性能分析器一起,看看爲什麼C#代碼先是緩慢的,以及您可以如何加速它。很可能,通過這種方式,您可以通過一小部分的努力獲得足夠滿足您的需求的代碼。如果您選擇更好的數據結構,您會覺得多麼驚人。