R.Tanaka.Ichiro's Blog

主にC# な話題です

目次

Blog 利用状況

ニュース

イベントに空デリゲートを仕込ませてみる(その2)

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

投稿日時 : 2008年11月28日 14:29

Feedback

# re: イベントに空デリゲートを仕込ませてみる(その2) 2008/11/28 20:03 なちゃ

こ、これは何の意味が…

# re: イベントに空デリゲートを仕込ませてみる(その2) 2008/12/01 13:40 R・田中一郎

null チェックせずに、更に、空デリゲートを呼び出さずに済むので、ちょっとだけ高速になりますw

# re: イベントに空デリゲートを仕込ませてみる(その2) 2008/12/01 23:52 名無し

ぬるぽ

# re: イベントに空デリゲートを仕込ませてみる(その2) 2008/12/02 6:28 R・田中一郎

Nortify する先がゼロ件のコレクションになるだけで、ぬるぽにはならないと思ふ。

# re: イベントに空デリゲートを仕込ませてみる(その2) 2008/12/02 8:07 れい

結論としては…
なんでもいいから一回追加して、すぐに削除しておけ、と。

空コレクションによるメモリの圧迫はどのくらいなのかしら。
全イベントに自動でこの処理をいれるようなコードを組んだらダメなのかな?

# re: イベントに空デリゲートを仕込ませてみる(その2) 2008/12/02 11:13 名無し

new Sample3().Fire();
でぬるぽになるんですけど使い方違うかしら

# re: イベントに空デリゲートを仕込ませてみる(その2) 2008/12/02 15:23 R・田中一郎

れい さん

>なんでもいいから一回追加して、すぐに削除しておけ、と。

あー、これだめです。
名無し氏の指摘通り、ぬるぽになるっす。
混乱させてしまって申し訳ないです。

------------------------------------------
名無し さん

>new Sample3().Fire();
>でぬるぽになるんですけど使い方違うかしら

今試したら、ぬるぽになりました。
僕が間違っていました。ごめんなさい。

一度登録して削除したら問題ないと、どこかで間違った解釈をしていました。
本エントリーも修正しておきます。

ご指摘ありがとうございました。

タイトル
名前
Url
コメント