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