【问题标题】:How do I invoke a Delegate faster than by using DynamicInvoke?如何比使用 DynamicInvoke 更快地调用委托?
【发布时间】:2011-04-23 20:07:16
【问题描述】:

目前我使用DynamicInvoke,速度很慢。还在使用Delegatetype 怎样才能直接调用Delegate而不用后期绑定/DynamicInvoke

Delegate _method;    
_method.DynamicInvoke(_args);

谢谢。

【问题讨论】:

  • 查看this 对类似问题的回答。
  • Thar 帖子使用 Action 而不是 Delegate。不知道为什么 Delegate 没有与 Action 相同的方法。
  • 发布真实代码。目前还不清楚为什么需要使用 Delegate 而不是声明的委托类型。
  • 已经有几年了,但现在您可以将Delegate 转换为声明的委托类型,前提是您事先知道参数和返回类型。这通过在类型化委托上使用 Invoke 方法创建接近原生的性能(在我的系统上比直接调用慢 5-10%)。

标签: c# .net .net-3.5 delegates


【解决方案1】:

开源框架Impromptu-IntefaceDelegate 添加了一个名为FastDynamicInvoke 的扩展方法,通过使用DLR 而不是反射,它的运行速度比DynamicInvoke 快20 多倍。

using ImpromptuInterface

...

_method.FastDynamicInvoke(_args);

【讨论】:

  • 那不就和打电话((dynamic)_method)(_args)一样吗?
  • 不,因为除非_method 的签名采用数组,否则无法解决。
  • @jbtule 你有示例比较代码吗?我今天试了一下,发现速度变慢了
  • @jbtule 谢谢!实际上我已经看到它更快但无论如何感谢链接。如果您是 lib 开发人员,还要感谢出色的 lib。
【解决方案2】:

Invoke 更快,但它有点“隐藏”。来自MSDN on Delegate class

公共语言运行时提供 每个委托的 Invoke 方法 类型,具有相同的签名 代表。您不必调用它 方法显式来自 C#, Visual Basic 或 Visual C++,因为 编译器会自动调用它。这 调用方法在反射中很有用 当你想找到的签名 委托类型。

这意味着当你创建一个委托类型时,Invoke 成员被编译器添加了正确的签名。这允许在不通过DynamicInvoke

的情况下调用

在 c# 中,你可以这样使用:

_method(_args);
//or
_method(typedArg1, typedArg2, andSoOn);

像普通方法一样调用它。这实际上调用了Invoke,这对你来说应该更快。

【讨论】:

  • 嗯,我无法将代码更改为 _method(_args);。我得到一个编译器错误“方法、委托或事件是预期的”
  • 您的代表实际上只是一个“代表”吗?还是您使用声明的签名?
  • 这是一个 System.Delegate。谢谢
  • 啊,对不起 - 那是有道理的。如果您只使用System.Delegate 作为委托类型,则不会生成Invoke 方法。如果您可以创建一个特定的委托,您将看到巨大的速度提升。然而,只有Delegate,这是不可能的——每次调用都是动态的。如果你真的需要走这条路,我建议你看看 c# 4 和 dynamic 类型,因为 DLR 有一些速度改进。
猜你喜欢
  • 2014-01-15
  • 2010-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-25
  • 1970-01-01
相关资源
最近更新 更多