当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《使用C++包装库的C#性能》经验,为你挑选了1个好方法。

我已阅读这个和这个,想知道如果我在C#中的功能通过这个库的C#包装使用从非托管C++库,在那里将是具有相同的方案相比在性能上有什么区别,但与非托管C++以及C完全++编写图书馆?我问的是关键性能差异大于1.5倍.请注意我只询问C++库的功能性能(有两种方式 - 使用和不使用C#包装器),隔离其他代码!

编辑后:

我只是想知道我是否想在C#中使用C++动态非托管库(.dll)并且我正在使用包装器 - 它将被编译为中间CIL代码而不是.我想只有包装器被编译为CIL,并且当C#想要从库中使用C++函数时,它只是使用包装器解析并将参数传递给C++函数,所以可能会有一些延迟,但不会就像我通过C#编写整个库一样.如果我误会请纠正我.



1> Hans Passant..:

当然,从托管代码执行切换到非托管代码执行都会产生开销.它非常适中,大约需要12个cpu周期.所有需要做的就是在堆栈上写一个"cookie",以便垃圾收集器可以识别后续堆栈帧属于非托管代码,因此不应检查有效的对象引用.

这些cookie像链表一样串在一起,支持C#代码调用本机代码的场景,而本机代码又调用托管代码.GC收集时遍历GC.并不像听起来那么罕见,例如,它发生在任何GUI应用程序中.Click事件是一个很好的例子,当UI线程管理GetMessage()时触发.

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

推荐阅读
地之南_816
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有