DynamicMethod.Invoke或DynamicMethod.CreateDelegate + Invoke - 哪个更快?

时间:2012-07-18 05:02:08

标签: c# .net clr dynamicmethod dynamic-method

以下哪项可提供更好的性能:

DynamicMethod dm = ....
..
//create IL for 'dm'
//store 'dm' for later use
..
..
later
..
..
dm.Invoke(..);

OR

DynamicMethod dm;
Delegate del = dm.CreateDelegate()
// store 'del' for later use
..
..
later
..
..
del(..);

请注意,通常会创建10个或100个不同的DynamicMethods,并且每个DynamicMethod(通过存储的'dm或'del'的哈希表)将被多次调用。

1 个答案:

答案 0 :(得分:3)

如果您只是创建“扔掉”方法(不再使用它们),那没关系。

如果您重复使用它们,第二个选项会明显加快。

<强>更新

第一个选项仅使用反射(RuntimeMethodHandle.InvokeMethodFast(...))。我将在内部假设,DynamicMethod也将在某个阶段编译,这将在第一次调用和可能的其他调用时产生一些额外的开销。

第二个选项DynamicMethod被显式编译为已知的委托类型。众所周知,“直接”委托调用几乎与“直接”方法调用一样快。

<强>意见:

始终使用第二个选项,即使只使用一次也是如此。除了大规模的性能提升之外,您还将获得一些编译时间的好处。