2012-03-15 39 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 <>改进的可能。
相关问题