ssu*_*ube 10 c# optimization pinvoke
如何加速从托管代码调用本机方法?
我正在编写一个程序,它需要能够管理任意大小的对象列表并高速检索它们的信息,并将其提供给脚本.脚本是编译的C#代码的一部分.我正在编写一个从C++(本机)DLL/SO/etc到C#(.Net或Mono)管理层的基本接口层.
现在,我一直在做一些测试,而且我发现平均来说,从托管代码PInvoking本机方法比在托管代码中完成所有这一切慢100倍(所有本机和所有托管都快速相同,供参考).
我使用的语法是:
[DllImport("test.dll")]
extern static public String test_method(String value);
String returnedValue = test_method("hello world");
有没有办法缓存指向函数的指针,快速调用程序的一些代码,这会在加载本机库后提高速度?这样可以很好地解决问题,所以我怀疑它是否存在.:P
编辑:我没有指定,但这需要适用于Windows,Linux(至少是Ubuntu)和Mac OS X,所有这些都适用于x86和x64.否则我会使用C++/CLI接口并完成它,但除非适用于所有3个平台,否则我无法使用它.
继我的问题评论之后,我们已经确定这是一个带有调试器的调试版本。这对 .Net 代码的运行时性能有巨大影响。容易犯错。:)
我猜在发布版本和没有附加调试器的情况下,性能差异现在更加合理。
如果您有一个非常健谈的 API,并且被调用的本机方法很便宜,那么方法调用开销可能是一个性能问题。尝试设计一个不那么健谈的 API。这是用于提高边界\系统通信性能的典型技术。
如果在对调试器问题进行排序后性能是可以接受的,我已经使用了一种简单的技术,只需添加一个属性,就可以轻松地大幅提高闲聊 API 的性能。
在您拥有导入函数的类(即 DllImport 函数)中,将SuppressUnmanagedCodeSecurity属性放在这些类上。这将从每个 P/Invoke 调用中删除一些昂贵的安全检查。请参阅有关SuppressUnmanagedCodeSecurity的文档以了解其后果。我倾向于将导入的函数组合在应用此属性的内部类(仅包含导入的函数)中。
| 归档时间: | 
 | 
| 查看次数: | 1989 次 | 
| 最近记录: |