none
c#调用非托管代码的效率问题 RRS feed

  • 问题

  • 同样功能的一个函数,用c#写,和用c++写,最后都编译成dll文件。
    2个函数除了语言上的不同外,其他都相同。
    那么用另外一个c#程序来分别调用这2个函数,效率上有何不同?
    说白了我就是想知道DllImport有性能损失没?
    2009年7月25日 2:01

答案

  • 你好,C#调用DllImport需要进行环境切换和数据编组,会有性能损失!
    jon.valett@gmail.com
    • 已标记为答案 HUNDRED 2009年7月25日 13:09
    2009年7月25日 12:04
    版主
  • 如果用托管C++来写的话,没啥区别,不过看起来你是想用非托管C++来写。这样的话你的问题不是语言相关的,托管的C++代码调用非托管的VB、Delphi代码有同样性能问题。

    每次环境切换的成本是10到30个x86指令加上数据传输的消耗。由于函数参数个数和类型不同,需要在托管堆和非托管堆之间复制的数据量也不一样,所以函数越复杂,数据传输的消耗越大。参数类型的内存布局相同时(例如Int32<->int),C++ interop、IJW和pinvoke的数据传递消耗是一样的,C++ interop在传递复杂的数据的时候比pinvoke快,但是还是不如IJW。另外,pinvoke在运行时要根据参数类型判断加载哪个函数版本和如何传递数据,C++ interop在编译时完成这个工作,而IJW则需要程序员来完成这个工作。如果多个函数使用同一个参数,IJW可以重用参数,而pinvoke和C++ Interop不行。

    如果调用的函数有自己的内存管理,不需要用户手动释放获得的内存(例如内存池和和返回地址在函数参数使用的内存中),那么最好用IJW。

    从代码的可读性来说,C++ interop最好,pinvoke其次,IJW最差。

    Please mark the post answered your question as the answer, and click the chartreuse pyramid floating over "Vote as helpful" to mark other helpful posts as helpful. This posting is provided "AS IS" with no warranties, and confers no rights.
    Visual C++ MVP
    • 已标记为答案 HUNDRED 2009年7月27日 1:40
    2009年7月25日 14:03
    版主

全部回复

  • 当然啦,用C++来开发非托管代码的效率肯定好,C#的优势在于托管代码,而托管代码的执行效率肯定是低于非托管代码的。
    另外,对于DllImport,既然有引用,肯定需要效率开销。
    http://hi.baidu.com/2009ajun
    2009年7月25日 2:50
  • 你好,C#调用DllImport需要进行环境切换和数据编组,会有性能损失!
    jon.valett@gmail.com
    • 已标记为答案 HUNDRED 2009年7月25日 13:09
    2009年7月25日 12:04
    版主
  • 如果用托管C++来写的话,没啥区别,不过看起来你是想用非托管C++来写。这样的话你的问题不是语言相关的,托管的C++代码调用非托管的VB、Delphi代码有同样性能问题。

    每次环境切换的成本是10到30个x86指令加上数据传输的消耗。由于函数参数个数和类型不同,需要在托管堆和非托管堆之间复制的数据量也不一样,所以函数越复杂,数据传输的消耗越大。参数类型的内存布局相同时(例如Int32<->int),C++ interop、IJW和pinvoke的数据传递消耗是一样的,C++ interop在传递复杂的数据的时候比pinvoke快,但是还是不如IJW。另外,pinvoke在运行时要根据参数类型判断加载哪个函数版本和如何传递数据,C++ interop在编译时完成这个工作,而IJW则需要程序员来完成这个工作。如果多个函数使用同一个参数,IJW可以重用参数,而pinvoke和C++ Interop不行。

    如果调用的函数有自己的内存管理,不需要用户手动释放获得的内存(例如内存池和和返回地址在函数参数使用的内存中),那么最好用IJW。

    从代码的可读性来说,C++ interop最好,pinvoke其次,IJW最差。

    Please mark the post answered your question as the answer, and click the chartreuse pyramid floating over "Vote as helpful" to mark other helpful posts as helpful. This posting is provided "AS IS" with no warranties, and confers no rights.
    Visual C++ MVP
    • 已标记为答案 HUNDRED 2009年7月27日 1:40
    2009年7月25日 14:03
    版主