我读0123'后,我试图做同样的事情,但我在比较del.DynamicINvoke(args)VS时遇到了一个非常奇怪的行为。德尔(参数)DynamicInvoke和Invoke的奇怪行为
更新
所以之后乔恩和USR意见,我现在发布的新的工作代码。
我会很感激任何帮助!
代码:
using System;
using System.Diagnostic;
using System.Threading;
namespace DynamicInvokeVsInvoke {
public class Program {
static void Main(string[] args) {
var objArgs = new object[] {100, 1.2345678 };
Action<int, double> a = (i, d) => {};
Action<object[]> action = o => a((int)o[0], (double)o[1]);
var sw = new Stopwatch();
sw.Start();
for (int i = 0; i < 1000; i++)
a.DynamicInvoke(objArgs);
Console.WriteLine("Dynamic: " + sw.ElapsedMilliseconds);
sw.Stop();
sw = new Stopwatch();
sw.Start();
for (int i = 0; i < 1000; i++)
action(objArgs);
Console.WriteLine("Invoke: " + sw.ElapsedMilliseconds);
sw.Stop();
}
}
}
结果:
当 'a' 是空的方法和循环运行百万倍DynamicInvoke需要大约4000毫秒和直接调用了20毫秒
当我放入Thread.Sleep(20)并且循环运行1000次时,DynamicInvoke和直接调用花费大约20秒
p.s.我无法从vs复制/粘贴出于某种原因,所以我手动编写代码如果您看到语法错误,请让我知道
你没有比较'del.Invoke'和'del.DynamicInvoke'。您直接调用的代理具有额外的“包装”级别。它没有解释所有的结果,但它是描述和你的代码之间的差异。 – 2012-07-16 05:56:38
@Jon我很明白,但仍然为什么如果我将它与空方法比较,包装约200更快然后dynamicinvoke,如果方法cobtains身体结果改变 – Maya 2012-07-16 06:42:11
不知道。尽管如此,为什么你使用事件或静态初始化器还不是很清楚。你为什么不把委托作为局部变量?您的代码目前不必要的复杂。 – 2012-07-16 07:13:54