c# - 优化托管到 native 调用

标签 c# optimization pinvoke

如何加快从托管代码调用 native 方法?

我正在编写一个程序,该程序需要能够管理任意大小的对象列表并从中高速检索信息,并将其输入脚本。脚本是一些编译后的 C# 代码。我正在编写从 C++( native )DLL/SO/等到 C#(.Net 或 Mono)管理层的基本接口(interface)层。

现在,我一直在做一些测试,我发现平均而言,从托管代码调用 native 方法比在托管代码中调用 native 方法慢 100 倍(所有 native 和所有托管都一样快,供引用)。

我使用的语法是:

[DllImport("test.dll")]
extern static public String test_method(String value);

String returnedValue = test_method("hello world");

有没有办法缓存指向函数的指针,一些快速调用程序的代码,这会在加载 native 库后提高速度?那会非常巧妙地解决问题,所以我怀疑它是否存在。 :P

编辑: 我没有指定,但这需要在 Windows、Linux(至少是 Ubuntu)和 Mac OS X 上工作,所有这些都适用于 x86 和 x64。否则我会使用 C++/CLI 接口(interface)并完成它,但除非它适用于所有 3 个平台,否则我不能使用它。

最佳答案

除了我的问题评论之外,我们已经确定它是一个附加了调试器的调试版本。这对 .NET 代码的运行时性能有巨大的影响。容易犯的错误。 :)

我猜测在没有附加调试器的情况下发布版本,性能差异现在更加合理。

如果您有一个非常繁琐的 API,并且被调用的本地方法很便宜,那么方法调用开销可能是一个性能问题。尝试设计一个不那么繁琐的 API。这是用于提高边界\系统通信性能的典型技术。

如果在解决调试器问题后性能可以接受,我使用了一种简单的技术,只需添加一个属性,就可以轻松地显着提高繁琐的 API 的性能。

在您拥有导入函数(即 DllImport 函数)的类中,放置 SuppressUnmanagedCodeSecurity类上的属性。这将从每个 P/Invoke 调用中删除一些昂贵的安全检查。请参阅 SuppressUnmanagedCodeSecurity 上的文档了解这件事的后果。我倾向于将导入的函数分组到内部类(仅包含导入的函数)中并应用此属性。

关于c# - 优化托管到 native 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3358900/

相关文章:

c# - 如何按行读取特定单词的文本文件并将整行写入另一个文本文件?

c# - 防止在 ASP.NET 中回发时关闭 Bootstrap 模式

algorithm - 有没有一种有效的方法来确定叶节点是否可以从有向无环图中的另一个任意节点到达?

c# - 从 C# Windows 应用程序调用 C dll 导致 svchost.exe 崩溃

c# - 在 Sitecore 页面编辑器中验证

c# - 在正则表达式中查找特定单词以及特殊字符

java - 我如何(漂亮地)将这部分代码提取到子类中?

javascript - 优化对象重叠检测 (Javascript)

c# - WTSQuerySessionInformation 返回不同的域名

c# - 编码(marshal) Win32 结构时的安全句柄 (PROCESS_INFORMATION)