C# 使用C++;包装库 我已经阅读过,并且想知道我是否通过这个库的C++封装器从非托管C++库中使用C++函数,与同一个程序相比,性能会有什么不同,但是完全写在非托管C++和C++库中吗?我问的是关键性能差异大于1.5倍。注意,我只询问C++库的功能性能(在两种方式中,有和不使用C语言包装器),隔离其他代码!

C# 使用C++;包装库 我已经阅读过,并且想知道我是否通过这个库的C++封装器从非托管C++库中使用C++函数,与同一个程序相比,性能会有什么不同,但是完全写在非托管C++和C++库中吗?我问的是关键性能差异大于1.5倍。注意,我只询问C++库的功能性能(在两种方式中,有和不使用C语言包装器),隔离其他代码!,c#,c++,performance,wrapper,C#,C++,Performance,Wrapper,编辑后: 我只是想知道我是否想在C++中使用C++动态非托管库(.dll),我使用的是包装器,它将被编译成中间CIL代码,而不是。我猜想只有包装器被编译成CIL,当C想从库中使用C++函数时,它只是使用包装器解析和传递参数到C++函数,所以可能会有一些延迟,但如果我通过C**编写整个库,则不会有延迟。如果我弄错了,请纠正我。当然,从托管代码执行切换到非托管代码执行涉及开销。它非常适中,大约需要12个cpu周期。需要做的只是在堆栈上写一个“cookie”,以便垃圾收集器能够识别后续堆栈帧属于非托管

编辑后:


<>我只是想知道我是否想在C++中使用C++动态非托管库(.dll),我使用的是包装器,它将被编译成中间CIL代码,而不是。我猜想只有包装器被编译成CIL,当C想从库中使用C++函数时,它只是使用包装器解析和传递参数到C++函数,所以可能会有一些延迟,但如果我通过C**编写整个库,则不会有延迟。如果我弄错了,请纠正我。

当然,从托管代码执行切换到非托管代码执行涉及开销。它非常适中,大约需要12个cpu周期。需要做的只是在堆栈上写一个“cookie”,以便垃圾收集器能够识别后续堆栈帧属于非托管代码,因此不应检查是否存在有效的对象引用

这些cookie像链表一样串在一起,支持C#code调用本机代码的场景,本机代码反过来又调用回托管代码。GC在收集时遍历。这听起来并不罕见,例如在任何GUI应用程序中都会发生。单击事件是一个很好的示例,当UI线程pinvokes GetMessage()时触发


然而,这并不是唯一需要做的事情,在任何实际场景中,都需要将参数传递给本机函数。它们可能需要更多的工作才能被封送为本机代码可以理解的格式。特别是数组,如果数组元素是可空袭的,那么它们需要被固定,这仍然非常便宜。当由于元素不可Blitttable而需要转换整个数组时,会变得非常昂贵。探查器并不总是容易识别的,它永远是检测低效代码的合适工具。

当然,从托管代码执行切换到非托管代码执行会带来开销。它非常适中,大约需要12个cpu周期。需要做的只是在堆栈上写一个“cookie”,以便垃圾收集器能够识别后续堆栈帧属于非托管代码,因此不应检查是否存在有效的对象引用

这些cookie像链表一样串在一起,支持C#code调用本机代码的场景,本机代码反过来又调用回托管代码。GC在收集时遍历。这听起来并不罕见,例如在任何GUI应用程序中都会发生。单击事件是一个很好的示例,当UI线程pinvokes GetMessage()时触发


然而,这并不是唯一需要做的事情,在任何实际场景中,都需要将参数传递给本机函数。它们可能需要更多的工作才能被封送为本机代码可以理解的格式。特别是数组,如果数组元素是可空袭的,那么它们需要被固定,这仍然非常便宜。当由于元素不可Blitttable而需要转换整个数组时,会变得非常昂贵。不容易识别,探查器永远是检测低效代码的合适工具。

看看这一点:@mecek在使用shelf软件时对您的客户说这句话。除了自己测试它,而不是询问已经指出的想法,您的问题非常抽象(关于哪种语言更快)因此,我并不真正负责。C++具有一些优点,但也有C语言;甚至在谈论纯性能时。这取决于你在做什么,以及你是如何做的。C是不是像C++那样快,因为它是编译(如java到字节码)到中间CIL代码。所以我想知道,通过C++包装器使用C++库有轻微的性能差异。我知道,如果我使用C语言库(完全使用C语言编写),相当于非托管C++,它会慢一些(没有人能说服我相反)。当然,如果算法是相同的。看看这个:@mecek在使用shelf软件时对客户说这句话。此外,你自己测试它,而不是询问已经指出的想法,你的问题非常抽象(关于哪种语言更快),因此并不真正可以回答。C++具有一些优点,但也有C语言;甚至在谈论纯性能时。这取决于你在做什么,以及你是如何做的。C是不是像C++那样快,因为它是编译(如java到字节码)到中间CIL代码。所以我想知道,通过C++包装器使用C++库有轻微的性能差异。我知道如果我使用C语言库(完全使用C语言编写),相当于非托管C++的速度会慢(没有人能说服我相反),当然如果算法是相同的。你的意思是C和C++在理论上分开存储空间,C垃圾收集程序只对C代码进行工作(如它应该)。当C代码将参数传递给C++函数时,所有的代码都被转换成非托管C++等价的。我想知道如果你把数组指针从C++到C++函数会发生什么——对象内存被C语言管理,但是在调用之后,你将在C++非托管代码中拥有指针。如果你从C(MulthTythLoad)中执行函数,删除C的指针,而C++中只有指针,GC是否可以释放内存?“单独的内存空间”不是正确的心智模型。托管代码和非托管代码之间没有根本的区别,它们得到的是con