【问题标题】:PInvoke or using /clr:pure to compilePInvoke 或使用 /clr:pure 编译
【发布时间】:2010-05-09 14:06:22
【问题描述】:

我有一组 C++ 数值库,我想用 F# 或 IronPython 等解释性语言交互地调用它们。

所以我现在有两个选择:

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

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

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

2 的优点是我不需要知道混编字符串、数组等。但是,.net dll 与本机相比要慢一些。

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

【问题讨论】:

    标签: .net c++-cli pinvoke


    【解决方案1】:

    根据我使用 C++/CLI 的经验,它的性能比 PInvoke 好很多

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

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

    C++/CLI 的唯一问题是它有点难学。这是一种相当复杂的语言,因为它同时具有所有 C++ 功能和所有 .NET 功能。 Visual Studio 并没有像对待 C# 那样对待它,而且你没有很好的工具 Resharper 可以使用。

    如果您关心性能,我相信您会发现 C++/CLI 是正确的选择。

    【讨论】:

    • 如果使用 C++/CLI 包装非托管 C++ DLL,然后从 C# 代码调用它,托管包装器的性能比从 C# 显式 PInvoke 差。我的网站上有几个博客讨论性能。你可能想看看。 C++/CLI vs Explicit PInvoke Performance
    【解决方案2】:

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

    另外...编组不是免费的。它往往涉及复制数据,尤其是在应用程序域之间。除非您的库使用来回传递的少量数据进行大量工作,否则编组数据的成本可能会抵消您通过使库原生获得的任何速度提升。

    只有一种万无一失的方法来回答这个问题:创建一个测试程序以在某种程度上像您实际使用它一样使用该库,双向编译这些东西,然后看看哪个对您来说更快。

    【讨论】:

      猜你喜欢
      • 2018-11-22
      • 2012-04-05
      • 1970-01-01
      • 1970-01-01
      • 2010-09-22
      • 1970-01-01
      • 2012-03-11
      • 2012-01-05
      • 1970-01-01
      相关资源
      最近更新 更多