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包装器

是否可以在 C# 中从本机 C++ 类创建变量?

用 C++/CLI 包装非托管 C++ - 一种正确的方法

C++提高编程C++全栈体系(十六)

(C++/CLI) 如何在 C++ CLI 中获取从本机代码到托管代码的回调?

如何从我的 C++/CLI 代码进入非托管 C++ 库