我读了这篇文章并尝试做同样的事情,但是在比较 del.DynamicINvoke(args) 与时遇到了一个非常奇怪的行为。德尔(参数)
更新
因此,在 Jon 和 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”为空方法并且循环运行 1000000 次时,DynamicInvoke 大约需要 4000 毫秒,直接调用需要 20 毫秒
当我放入 Thread.Sleep(20) 并且循环运行 1000 次时,DynamicInvoke 和直接 Invoke 大约需要 20 秒
ps 由于某种原因,我无法从 vs 复制/粘贴,所以如果您看到语法错误,我会手动编写代码,请告诉我