http://blogs.wankuma.com/rti/archive/2008/11/25/162080.aspx
イベントに空デリゲートを仕込ませてみる
の続きです。
なんかね。
もうネタみたいなノリですが・・・
今のところ一番高速なイベントの発行方法は何になるのかを言う点で、もう一つテストしてみましたw
static class Program {
static void Main() {
var t = new System.Diagnostics.Stopwatch();
ISample[] a = { new Sample1(), new Sample2(), new Sample3() };
foreach(var i in Enumerable.Range(1, 5)) {
Console.WriteLine(i.ToString() + "回目のテスト-----");
foreach(var x in a) {
x.Hello += (sender, e) => {};
t.Reset();
t.Start();
foreach(var j in Enumerable.Range(0, 10000000)) x.Fire();
t.Stop();
Console.WriteLine(t.ElapsedTicks);
}
}
}
}
public interface ISample {
event EventHandler Hello;
void Fire();
}
public class Sample1 : ISample {
public event EventHandler Hello = delegate {};
public void Fire() {
Hello(this, EventArgs.Empty);
}
}
public class Sample2 : ISample {
public event EventHandler Hello;
public void Fire() {
if (Hello != null) Hello(this, EventArgs.Empty);
}
}
public class Sample3 : ISample {
public event EventHandler Hello;
public Sample3() {
EventHandler a = (s, e) => {};
this.Hello += a; // 空のデリゲートを追加
this.Hello -= a; // そして削除
}
public void Fire() {
Hello(this, EventArgs.Empty);
}
}
予想通り 3 つめの方法が一番速かったのですが、なんだかなーw
結局、追加して削除すると Hello は結局 null になるので、null 判定が必要になってしまうということで、何の意味もないことが判明しました^^;
1回目のテスト-----
15395951
10936789
8528138
2回目のテスト-----
20825413
18579851
16931178
3回目のテスト-----
22897323
21193492
20088012
4回目のテスト-----
26703979
24008862
23279166
5回目のテスト-----
28991140
27286683
26205073