【问题标题】:DynamicMethod.Invoke or DynamicMethod.CreateDelegate+Invoke - which is faster?DynamicMethod.Invoke 或 DynamicMethod.CreateDelegate+Invoke - 哪个更快?
【发布时间】:2012-07-18 05:02:08
【问题描述】:

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

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

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

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

【问题讨论】:

  • 基准测试应该非常简单......

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


【解决方案1】:

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

如果你重用它们,第二个选项会明显更快。

更新:

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

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

意见:

始终使用第二个选项,即使只使用一次。除了大幅提高性能外,您还将获得一些编译时间优势。

【讨论】:

  • 我需要反复给他们打电话。
猜你喜欢
  • 1970-01-01
  • 2010-11-10
  • 2012-10-03
  • 2011-02-15
  • 2012-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多