在委托中存储平台调用的性能优势?

时间:2013-03-12 17:08:07

标签: c# interop

OpenTK通过首先定义一个具有与某个目标C函数匹配的签名的委托来对OpenGL进行绑定:

[System.Security.SuppressUnmanagedCodeSecurity()]
internal delegate void Uniform1f(Int32 location, Single v0);
internal static Uniform1f glUniform1f;

然后它为从特定于平台的OpenGL glUniform1f函数返回的GetProcAddress赋值。

如果我不使用OpenTK的方法,而只是使用DllImport来调用该函数,我的代码会执行得更慢吗? (换句话说,使用代表是否有任何性能优势)。

1 个答案:

答案 0 :(得分:2)

不,如果有的话,会有一个性能点击(虽然在大多数情况下非常微不足道),因为你正在使用一个代表。

请记住,委托是对方法的引用。每次调用时,该引用都必须 derefrenced 。将此与编译到代码中的方法调用进行比较;当方法引用被烘焙到IL中时,运行时确切地知道它必须去哪里。

请注意,自.NET 3.0以来,委托性能已显着提高 。随着LINQ的引入,代表们将被大量使用,并且无处不在,他们 要快。

您看到代理被使用的一个可能原因是因为包含非托管代码的DLL需要在运行时确定(可能是因为命名问题,特定于处理器的构建以不同的名称分布在一起等)。

在这种情况下,系统会调用非托管LoadLibrary Windows API function,然后调用非托管GetProcAddress Windows API function

一旦检索到函数poitner,它就会被传递到GetDelegateForFunctionPointer method上的Marshal class以获得代理。