2012-03-15 65 views
0

當我們從「單一系統」應用程序轉移到可將任務轉移到分佈式處理節點的應用程序時,我們正在改變大量代碼。現有代碼混合使用非託管和現在管理的C++代碼,但也使用C#代碼在節點和控制器之間提供WCF接口。將MFC CArray <int>轉換爲託管C++中的列表<int>的最快轉換

作爲此舉的結果,我看到在可預見的未來可能會保留的通用代碼模式是將MFC CArray中的整數ID值轉換爲託管列表的基本轉換,以啓用WCF上的序列化。目前的格局是:

List<int>^ fixtures = gcnew List<int>(aFixtureIds.GetCount()); 

for(int i = 0; i < aFixtureIds.GetCount(); i++) //aFixtureIds is of MFC type CArray<int,int> 
    { 
     fixtures->Add(aFixtureIds[i]); 
    } 

我們還可以使用反向類似的東西,在這裏如果返回一個列表,我們可以通過它在一個迭代循環並調用添加它轉換成一個CIntArray用於調用函數。

我明白上面看起來不是很密集,但它確實被稱爲很多 - 是否有一個更好的模式來執行這個基本列表< - > CArray轉換會佔用較少的處理時間?這是一種可以被編譯器有效優化的代碼(我懷疑它不是,但願意糾正)?清單大小各不相同,但通常是從1到數萬個項目的任何項目,可能更多。

回答

0

一些建議雖然很多這將取決於你的應用程序的詳細信息:

  • 措施:我想這不會過時,每上的表現讓問題一直人只是說「測量第一」,但是這通常(總是?)很好的建議,特別是在這種情況下。我擔心你估計在現代臺式計算機上這樣的轉換會花費多少時間。例如,在我4年前的桌面上進行的快速測試表明,我可以在250毫秒內將1億個整數添加到CArray中。我期望在C#中List的性能大致相同。這意味着您的10,000個元素列表需要大約25微秒的時間才能運行。現在,很明顯,如果你正在做這1000次的第二個或數十億的元件,但是雖然在這些情況下,該解決方案將不會是一個更快的算法,但一個更好的成爲一個問題。
  • 更新在需要時:只有當你真正需要的信息更新的陣列。如果您經常更新,僅僅是因爲您可能需要它,那麼您可能會浪費從未使用的轉換。不是更新在一個時間整個陣列更新同時在列表中的兩個拷貝的元素:
  • 同步更新。
  • 只需使用一個列表:雖然這聽起來像你不能做到這一點只用一個列表,而不是同一信息的兩個副本至少考慮。隱藏在一個函數/方法/類的元素訪問,所以你不需要知道數據是否存儲在一個CARRAY <>或List <>。
  • 更好的設計/算法:如果您測量並發現在此轉換中花費了大量時間,那麼通過改進代碼設計以減少或消除轉換,您可能會獲得更好的回報需要。副手,有可能不是一大堆的只是複製CARRAY <>到List <>改進的可能。
相關問題