【问题标题】:C++/CLI performance compared to Native C++?C++/CLI 性能与本机 C++ 相比?
【发布时间】:2011-05-20 21:50:54
【问题描述】:

早上好,

我正在编写一个拼写检查器,在这种情况下,它对性能至关重要。也就是说,由于我打算连接到数据库并使用 C# 制作 GUI,所以我用 C 语言编写了一个编辑距离计算例程并编译为我在 C# 中使用DllImport 使用的 DLL。问题是我认为(虽然我可能错了)从Stringchar * 一个一个地编组单词会导致大量开销。也就是说,我考虑过使用 C++/CLI,以便我可以直接在 .NET 中使用 String 类型...我的问题是 C++/CLI 性能与本机 C 代码相比如何进行繁重的数学计算和数组访问?

非常感谢。

【问题讨论】:

  • 我认为,CIL 也是这样做的,但是是隐含的。
  • 为什么要一个一个传字?传递整个 txt。

标签: c# performance c++-cli dllimport native-code


【解决方案1】:

C++/CLI 也必须进行某种编组。

像所有与性能相关的问题一样,您应该衡量和优化。您确定 C# 的速度不足以满足您的目的吗?不要低估 JIT 编译器要做的优化。不要仅仅为了在没有尝试的情况下进行管理而推测语言实现的开销。如果这还不够,在尝试非托管代码之前,您是否考虑过不安全的 C# 代码(带有指针)?

关于 C++/CLI 的性能,它实际上取决于它的使用方式。如果您使用 (/clr:pure) 编译为托管代码 (CIL),它与 ​​C# 不会有太大不同。 C++/CLI 中的本机 C++ 函数将具有与普通 C++ 相似的性能特征。在原生 C++ 和 CLI 环境之间传递对象会有一些开销。

【讨论】:

  • 不安全的 C# 代码的速度大约是我使用 DllImport 导入的 C 函数的两倍。
【解决方案2】:

我不认为 DLLImport 会成为瓶颈。
我编写了每秒调用 DLLImport 数百次的程序,它运行良好。
您将支付少量性能罚款,但罚款很少。

【讨论】:

    【解决方案3】:

    不要假设您知道需要优化什么。让抽样告诉你。

    我已经做了几个拼写校正器,我做的方式 (outlined here) 是将字典组织为内存中的 trie,然后搜索它。 如果词的数量很大,通过共享公共后缀可以大大减少trie的大小。

    【讨论】:

    • 不是这样的……我其实用的是BK-Tree,所以我的做法和你说的有很大的不同。
    • @Miguel:好的,已更正。无论如何,我所做的是在 trie 中进行分支定界搜索,效果很好。另一种选择是混合深度优先/广度优先,但我认为分支定界的性能大致相同,并且在可以处理的拼写错误种类方面更加灵活。
    猜你喜欢
    • 1970-01-01
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    • 2012-04-03
    • 1970-01-01
    • 1970-01-01
    • 2010-12-31
    • 1970-01-01
    相关资源
    最近更新 更多