使用 C++ 包装库的 C# 性能

Performance of C# using C++ wrapped libraries

我已阅读 this and this 并想知道如果我通过此库的 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 线程调用 GetMessage() 时触发。

然而,这并不是唯一需要发生的事情,在任何实际场景中,您还可以将参数传递给本机函数。他们可能需要做更多的工作才能编组为本机代码可以理解的格式。特别是数组,如果数组元素 blittable,它们将需要固定,这仍然很便宜。当整个数组需要转换时变得昂贵,因为元素不可 blittable。并不总是容易识别,探查器永远是检测低效代码的合适工具。