从托管代码性能调用本机代码

时间:2011-05-14 15:30:36

标签: c# .net performance pinvoke

这是一个简单的样本。

CodeDLL.cpp文件:

extern "C" {
    __declspec(dllexport) int __cdecl SimulateGameDLL (int a, int b) {
              return a*b; // Calculation in native code
      }
}

GameSharp.cs文件:

static class GameSharp
{
    public static class UnsafeNativeMethods
    {
        const string _dllLocation = "CoreDLL.dll";

        [DllImport(_dllLocation)]
        public static extern int SimulateGameDLL(int a, int b);
    }
}

static class GameSharp
{
    public static class GameSharpClass
    {       
        public static int SimulateGameDLL(int a, int b) {
             return a*b; //Calculation in managed code
        }
    }
}

第一个:我有一个用c ++本机代码编写的dll文件,我尝试在托管代码中调用函数。(包装器)

在第二个我已将其转换为托管代码。 我的代码并不像这样简单。哪一个更好转换我的c ++本机代码到托管或从托管代码调用它。 哪一个更快?为什么呢?

如果不清楚,请告诉我我会更多地讨论它。在告诉我之前不要投票结束。 :)谢谢

2 个答案:

答案 0 :(得分:3)

由于您的代码不是那么简单,我会告诉它取决于您转换为非托管代码的代码类型。如果代码与复杂的数字操作有关,那么非托管版本可能比托管版本更快,但我认为你应该比编译器编译或优化代码的方式更多地检查你的算法。

答案 1 :(得分:2)

我相信在.NET中的性能方面,托管代码和非托管代码之间没有明显的区别。

如果全部在.NET上运行,我会将你的非托管代码转换为托管代码。

我认为你不应该担心这个级别的性能瓶颈。如果你正在进行游戏开发,那么在网络和图形方面你应该担心性能(使用着色器)。

编辑:

http://msdn.microsoft.com/en-us/library/bb677124.aspx

“最高执行速度。托管层为程序增加了大约10%的开销。” (对于Windows Mobile)