1

我正在为 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++ 会更快是正确的吗?

4

3 回答 3

1

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

但是,如果您打算使用 C++/CLI,那么在某些时候您仍然会拥有 native->managed interop。在链中的某个地方,您将跨数据编组,尽管如果您可以将其移到这些循环之外,您可能会更快一些(如果您将递归设为 100% 本机,则互操作调用会少得多)。

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

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

于 2009-08-08T22:40:47.243 回答
0

与代码模型的速度相比,插件/包语言的速度微不足道。编辑:好的,也许我过火了,但说真的,这里的第一句话是正确的。

于 2009-08-08T22:02:16.993 回答
0

C++ 不太可能更快。

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

于 2009-08-08T22:16:43.797 回答