使用C++封装库的C#的性能
本文关键字:性能 C++ 封装 使用 | 更新日期: 2023-09-27 18:26:52
我读过这个和这个,想知道如果我通过该库的C#包装器在C#中使用非托管C++库中的函数,与完全用非托管C++和C++库编写的同一程序相比,性能会有什么不同吗?我问的是,关键性能差异大于1.5倍。注意,我只询问C++库的函数性能(通过两种方式——使用和不使用C#包装器),隔离其他代码!
编辑后:
我只是想知道我是否想在C#中使用C++动态非托管库(.dll),而我正在使用包装器——它将被编译为中间CIL代码,而不是。我想只有包装器被编译到CIL,当C#想要使用库中的C++函数时,它只是使用包装器解析并将参数传递给C++函数,所以可能会有一些延迟,但不像我通过C#编写整个库那样。如果我弄错了,请纠正我。
当然,从托管代码执行切换到非托管代码执行会带来开销。它非常适中,大约需要12个cpu周期。所需要做的就是在堆栈上写一个"cookie",这样垃圾收集器就可以识别出后续堆栈帧属于非托管代码,因此不应该检查有效的对象引用。
这些cookie像链表一样串在一起,支持C#代码调用本机代码的场景,而本机代码又调用回托管代码。GC在收集时遍历。这听起来并不罕见,例如,它发生在任何GUI应用程序中。Click事件就是一个很好的例子,当UI线程pinvokes GetMessage()时触发。
然而,这并不是唯一需要发生的事情,在任何实际场景中,您还可以将参数传递给本机函数。它们可能需要做更多的工作才能封送为本机代码能够理解的格式。特别是数组,如果数组元素是blitable,那么它们将需要被固定,这仍然非常便宜。当由于元素不可blitable而需要转换整个数组时,成本会变高。探查器并不总是容易识别的,它永远是检测低效代码的合适工具。