以下哪项可提供更好的性能:
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'的哈希表)将被多次调用。
答案 0 :(得分:3)
如果您只是创建“扔掉”方法(不再使用它们),那没关系。
如果您重复使用它们,第二个选项会明显加快。
<强>更新强>
第一个选项仅使用反射(RuntimeMethodHandle.InvokeMethodFast(...)
)。我将在内部假设,DynamicMethod
也将在某个阶段编译,这将在第一次调用和可能的其他调用时产生一些额外的开销。
第二个选项DynamicMethod
被显式编译为已知的委托类型。众所周知,“直接”委托调用几乎与“直接”方法调用一样快。
<强>意见:强>
始终使用第二个选项,即使只使用一次也是如此。除了大规模的性能提升之外,您还将获得一些编译时间的好处。