C++/CLI + C++ Native 会提高性能吗? [关闭]
Posted
技术标签:
【中文标题】C++/CLI + C++ Native 会提高性能吗? [关闭]【英文标题】:Will C++/CLI + C++ Native increases performance? [closed] 【发布时间】:2013-08-01 10:35:10 【问题描述】:在我们的项目中,我们有三个模块。 C++(本机)、C++/CLI、C#。我们正在使用 C++/CLI 在 C# 中使用 C++(Native) 代码。为此,我们将 C++(Native) 与 C++/CLI 静态链接,现在我们可以将 C++/CLI 托管的 dll 与 C# 一起使用。
现在,C++(Native)中的代码是简单的数学算法(没有 Win32,没有与操作系统的交互)。当我将静态库与 C++/CLI 链接时,它不会成为托管代码吗?意味着它不会属于 CLR。
在 C# 中将 C++(本机)静态库与 C++/CLI 结合使用会提高我的性能吗?我能不能实现用 C# 本身而不是本机代码编写代码。
请注意,我们在 C++(本机)代码中广泛使用了标准 C++ 库的算法、容器和迭代器。
谢谢。
【问题讨论】:
我看到人们想结束我的问题。我是否问过一些不客观的问题。人们在设计产品时假设 C++ Native 的性能总是比 .Net 更好。我只是想澄清一下天气假设是否正确。 @ÖöTiib 这些知识从何而来? 【参考方案1】:当我将静态库与 C++/CLI 链接时,它不会成为托管代码吗?表示它不属于 CLR。
不,不一定。在 C++/CLI 中,所有托管类型都将编译为 MSIL,代码将在 CLR 下运行。本机类型要么编译为 MSIL 或本机机器代码,具体取决于您的 compiler options:
/clr
选项生成本机代码和托管代码的混合体。
/clr:pure
选项生成一个仅托管程序集,该程序集可以包含编译为 MSIL 的本机类型。这基本上就像使用 /unsafe
选项编译的 C# 代码一样。
/clr:safe
选项生成不包含本机代码的仅托管程序集。这基本上就像编译的 C# 代码没有 /unsafe
选项。
在 C# 中将 C++(本机)静态库与 C++/CLI 结合使用会提高我的性能吗?我能不能实现用 C# 本身而不是原生代码编写代码。
与所有优化问题一样,答案是视情况而定。一方面,本机代码通常比托管代码更快,并且可以进行更高度优化(例如,使用 SIMD)。另一方面,存在与混合模式程序集相关的性能损失。 C++ 互操作实现通常非常快(肯定比 C# 中的 P/Invoke 快得多),但是如果您从编译为本机代码获得的收益不够大,那么它可能仍然不值得。真正知道的唯一方法是测试这两个选项。
托管代码经常受到诟病,尤其是经验丰富的 C++ 程序员,但事实是,编写良好的 C# 代码可以与等效的本地 C++ 代码一样快,甚至更快。 很多在 C++ 中自爆也更容易,所以如果你的开发人员团队是 C# 专家而不一定是 C++ 专家,那么你的结果很可能很糟糕- 编写且速度较慢的 C++ 代码。最后,当您的项目的其余部分全部使用 C# 时,降低的维护成本可能意味着即使 相似 性能也是可以接受的。
【讨论】:
+1。解决了我的疑惑。这意味着,我们可以选择安全和不安全,所以我的设计还不错。以上是关于C++/CLI + C++ Native 会提高性能吗? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
在Visual Studio 2010中将Native / C ++ DLL链接到托管C ++ / CLI包装器