将C++/CLI+C++Native提高性能
本文关键字:高性能 CLI+C++Native C++ | 更新日期: 2023-09-27 18:25:57
在我们的项目中,我们有三个模块。C++(本机)、C++/CLI、C#。我们使用C++/CLI在C#中使用C++(本机)代码。为此,我们将C++(Native)与C++/CLI静态链接,现在我们可以将C++/CLI管理的dll与C#一起使用。
现在,C++(Native)中的代码是简单的数学算法(没有Win32,没有与操作系统的交互)。当我用C++/CLI链接静态lib时,它不会变成托管代码吗?意味着它不会被纳入CLR。
在C#中使用C++(本机)静态库和C++/CLI是否会提高我的性能?难道我不能用C#本身而不是本机代码来实现代码编写吗。
请注意,我们在C++(Native)代码中广泛使用了标准C++库的算法、容器和迭代器。
谢谢。
当我用C++/CLI链接静态lib时,它不会变成托管代码吗?意味着它不会被纳入CLR。
不,不一定。在C++/CLI中,所有托管类型都将编译为MSIL,代码将在CLR下运行。本机类型编译为MSIL或本机代码,具体取决于您的编译器选项:
/clr
选项生成本地代码和托管代码的混合体/clr:pure
选项生成一个只能包含编译为MSIL的本机类型的托管程序集。这基本上类似于使用/unsafe
选项编译的C#代码/clr:safe
选项生成不包含本机代码的仅托管程序集。这基本上类似于在没有/unsafe
选项的情况下编译的C#代码
在C#中使用C++(本机)静态库和C++/CLI是否会提高我的性能?难道我不能用C#本身而不是本机代码来实现代码编写吗。
就像所有优化问题一样,答案是取决于具体情况。一方面,本机代码通常比托管代码更快,并且可以进行更高度的优化(例如使用SIMD)。另一方面,存在与混合模式程序集相关联的性能打击。C++互操作实现通常很快(当然比C#中的P/Invoke快得多),但如果从编译到本机代码中获得的收益还不够大,那么它可能仍然不值得。真正知道这一点的唯一方法是测试这两个选项。
托管代码经常受到不好的评价,尤其是来自经验丰富的C++程序员,但事实是,写得好的C#代码可能与同等的原生C++代码一样快。在C++中开枪也更容易,所以如果你有一个C#专家团队,而不一定是C++专家,你很可能会得到写得很差、速度较慢的C++代码。最后,当项目的其余部分都在C#中时,降低的维护成本可能意味着即使类似的性能也是可以接受的。