PInvoke或使用/ clr:pure来编译

时间:2010-05-09 02:20:54

标签: .net c++-cli pinvoke

我在C ++中有一组数值库,我想用F#或IronPython等解释语言以交互方式调用它们。

所以我现在有两个选择:

  1. 在本机DLL中编译库,并使用PInvoke调用其中的函数。

  2. 使用visual c ++(/ clr:pure compile option)将C ++库编译为.Net dll。

  3. 1的优点是它非常快,但是其中有更多的工作,例如我不能PInvoke双指针(例如float **),我必须在C ++库中编写另一个包装器,以使界面对.Net友好。

    2的优点是我不需要知道Mashaling字符串,数组等。但是,.net dll比原生字符慢。

    在两者之间进行选择时应考虑其他因素吗?

2 个答案:

答案 0 :(得分:1)

你测量过速度的差异吗? .net并不像人们想象的那么慢 - 一旦.net应用程序被加载,它通常被jitted运行,并且通常运行速度几乎与将其编译为本机代码一样快。

另外......编组不是免费的。它往往涉及复制数据,尤其是应用程序域之间。除非你的图书馆做大量的工作而来回传递的数据很少,否则编组数据的成本可能会抵消你通过使图书馆本地化而获得的任何速度提升。

只有一种万无一失的方法可以回答这个问题:创建一个测试程序,在你实际使用它的时候稍微使用一下这个库,两种方式编译它们,然后看看哪一个更快。

答案 1 :(得分:1)

根据我使用C ++ / CLI的经验,它比PInvoke更好地执行更多

我使用C ++ / CLI包装了很多C代码,效果很好。

它还有其他好处:能够使用C ++,能够创建调用C函数的特定.NET接口,甚至可以轻松地在.NET类中保留已分配的非托管内存。它还允许您在编写和运行单元测试时查看非托管代码中的代码覆盖率。

C ++ / CLI的唯一问题是它有点难学。它是一种非常复杂的语言,因为它具有所有C ++特性和所有.NET特性。 Visual Studio并不像C#那样对待它,并且没有很好的工具Resharper可以使用。

如果你关心性能,我很肯定你会发现C ++ / CLI是正确的选择。