CodeModel和其他COM对象的托管C ++与C#性能

时间:2009-08-08 21:59:09

标签: c# visual-studio-2008 com managed-c++

我正在为Visual Studio 2008创建一个扩展,因为我不想为C ++编写自己的解析器(我不是自虐)我使用的是VCCodeModel。

从这些COM对象中获取一个简单的字段比我正在进行的任何其他操作花费的时间要多几个数量级,并且由于我正在深入研究非常大的C ++项目的方法级别,因此我在最低级别上具有这种低效率我的递归。

   vcCodeBaseFunctions = ((Microsoft.VisualStudio.VCCodeModel.VCCodeElements)
                                (vcCM.Functions));
   int i = 0;
   for (i = 1; i <= vcCodeBaseFunctions.Count; i++)
   {
     if (vcCodeBaseFunctions.Item(i).Kind == vsCMElement.vsCMElementFunction)
                parent.AppendChild(MethodWrapper.VCCodeFunctionToXML(
                          (VCCodeFunction)vcCodeBaseFunctions.Item(i)));
   }

前面的代码将遍历项目基础级别的所有函数,将它们转换为XML然后保存它们。 XML方法将调用VCCodeFunction内的多个字段,如名称,参数等。

为此目的,托管C ++是否比C#更快?我不太了解托管C ++的后端与C#的不同之处,但我的直觉会让我相信C ++中托管和非托管代码之间的“上下文切换”成本较少,但我错了吗?我认为使用CodeModel在C ++中使用托管代码和非托管代码之间反复切换,我得到了一点点减速,所以我认为托管C ++会更快吗?

3 个答案:

答案 0 :(得分:1)

.NET中的COM互操作层存在开销。如果您要使用C ++,则可以将COM访问权移动到本机代码中,这将加快代码访问的这一部分。

但是,如果您计划使用C ++ / CLI,那么在某些时候您仍然会使用native-gt;托管互操作。在链中的某个地方,你将整理数据,尽管如果你可以在这些循环之外移动它可能会更快一些(如果你使递归100%原生,你的互操作调用会少得多)。 / p>

话虽如此,VCCodeModel并不是特别快 - 尽管我同意你在COM互操作中获得一些开销,但要注意你正在使用的分析器可能夸大了这一点。如果您使用跟踪分析器,则尤其如此,因为在分析期间您将花费更多时间在实际发布运行期间。分析器并不完美,这可能是由于您的分析器导致结果偏差的情况。

我怀疑你的潜在速度提升不值得一个端口 - 尽管如果没有更多信息就很难确定。

答案 1 :(得分:0)

与代码模型的速度相比,加载项/包语言速度 nothing 。编辑:好吧,也许我过火了,但说真的,这里的第一句话是正确的。

答案 2 :(得分:0)

C ++不太可能更快。

编写自己的解析器可能会执行更快。当然,编写自己的解析器可能需要更长的时间。