1

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

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' 的哈希表)将被多次调用。

4

1 回答 1

3

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

但是,如果您重用它们,则第二个选项将明显更快。

更新:

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

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

观点:

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

于 2012-07-18T05:20:22.797 回答