イントレ。
2010-03-25
どっちが早いのか気になったので、ちょっとテストしてみた。
フィールドとプロパティの通常・リフレクション経由の読み書きを100万回行って時間計測。
read-field(normal): 27.3012ms
read-property(normal): 58.4602ms
read-field(reflection): 395.7991ms
write-property(normal): 397.8156ms
write-field(normal): 398.9727ms
write-field(reflection): 1005.3316ms
read-property(reflection): 2019.6969ms
write-property(reflection): 3130.8138ms
やっぱりフィールドへの読み書きは早いですね。
そして、プロパティへのリフレクション経由読み書きは絶望的なほど遅いですね・・・。
ついでにLambdaExpressionのメンバー名取得も計測。
INotifyPropertyChangedのいけてる実装とかでつかってるやつ。
GetName(() => PROPERTY); // == "PROPERTY"
みたいな感じで、ラムダ式で指定したプロパティ名を取得するってコードになります。
VSのリファクタ機能とか使えるので名前変更とか使ってる場所特定とか、文字リテラルを使うよりメリットは多いです。
が。10万回のテストで2019msとハンパなく遅いです。(文字リテラル指定だと2ms程度)
リフレクション絡む部分はコストが高いってことで、使い方をちゃんと考えなければいけないなぁ。
フィールドとプロパティの通常・リフレクション経由の読み書きを100万回行って時間計測。
read-field(normal): 27.3012ms
read-property(normal): 58.4602ms
read-field(reflection): 395.7991ms
write-property(normal): 397.8156ms
write-field(normal): 398.9727ms
write-field(reflection): 1005.3316ms
read-property(reflection): 2019.6969ms
write-property(reflection): 3130.8138ms
やっぱりフィールドへの読み書きは早いですね。
そして、プロパティへのリフレクション経由読み書きは絶望的なほど遅いですね・・・。
ついでにLambdaExpressionのメンバー名取得も計測。
INotifyPropertyChangedのいけてる実装とかでつかってるやつ。
GetName(() => PROPERTY); // == "PROPERTY"
みたいな感じで、ラムダ式で指定したプロパティ名を取得するってコードになります。
VSのリファクタ機能とか使えるので名前変更とか使ってる場所特定とか、文字リテラルを使うよりメリットは多いです。
が。10万回のテストで2019msとハンパなく遅いです。(文字リテラル指定だと2ms程度)
リフレクション絡む部分はコストが高いってことで、使い方をちゃんと考えなければいけないなぁ。
2010-03-22
WPFのコンテキストメニューの見た目がなんか嫌。なの。
↓
WinFormsの使えばいいじゃん?
↓
WinForms.ContexuMenu.Show()がWinForms.Control要求する。なの。
↓
WinForms.ContextMenuStrip使えばいいじゃん?
↓
独自な外見は嫌。なの。
↓
じゃ、WinForms.ContextMenuのハンドルもらってAPIで表示すればいいじゃん?
↓
TrackPopupMenuExで実行してもクリックイベント発行されない。なの。
という経緯で、調査したらリフレクションでコマンドディスパッチャを呼び出せばOKっぽい。
具体的には、System.Windows.Forms.Command.DispatchID()メソッドを呼び出す。
Commandクラスはinternalで、DispatchIDメソッドはstatic。
DispatchIDはコマンドIDを引数にとるので、
TrackPopupMenuEx()にTPM_RETURNCMD(0x100)を指定して、コマンドIDを返すようにしてもらう。
var menu = new WinForms.ContextMenu(...);
var id = TrackPopupMenuEx(menu.Handle, 0x100, x, y, hWnd, IntPtr.Zero);
if (id != 0)
{
var asm = typeof(WinForms.ICommandExecutor).Assembly;
var type = asm.GetType("System.Windows.Forms.Command");
var method = type.GetMethod("DispatchID");
method.Invoke(null, new object[]{ id });
}
これでMenuItem.Clickイベントが発動するようになった。
とはいえinternalクラスを使ってる以上、WinFormsの中身の構成が変わったら使うものにならなくなるわけだが。
↓
WinFormsの使えばいいじゃん?
↓
WinForms.ContexuMenu.Show()がWinForms.Control要求する。なの。
↓
WinForms.ContextMenuStrip使えばいいじゃん?
↓
独自な外見は嫌。なの。
↓
じゃ、WinForms.ContextMenuのハンドルもらってAPIで表示すればいいじゃん?
↓
TrackPopupMenuExで実行してもクリックイベント発行されない。なの。
という経緯で、調査したらリフレクションでコマンドディスパッチャを呼び出せばOKっぽい。
具体的には、System.Windows.Forms.Command.DispatchID()メソッドを呼び出す。
Commandクラスはinternalで、DispatchIDメソッドはstatic。
DispatchIDはコマンドIDを引数にとるので、
TrackPopupMenuEx()にTPM_RETURNCMD(0x100)を指定して、コマンドIDを返すようにしてもらう。
var menu = new WinForms.ContextMenu(...);
var id = TrackPopupMenuEx(menu.Handle, 0x100, x, y, hWnd, IntPtr.Zero);
if (id != 0)
{
var asm = typeof(WinForms.ICommandExecutor).Assembly;
var type = asm.GetType("System.Windows.Forms.Command");
var method = type.GetMethod("DispatchID");
method.Invoke(null, new object[]{ id });
}
これでMenuItem.Clickイベントが発動するようになった。
とはいえinternalクラスを使ってる以上、WinFormsの中身の構成が変わったら使うものにならなくなるわけだが。
2010-03-15
http://live.visitmix.com/
たぶん深夜1時30分か2時30分。
公式サイト行ってストリーミング始まってたら喰い付かなきゃですね。
Silverlight4のRTWもありそうですが、それよりもIE9&HTML5が気になりますね。
PDC09でお披露目されてから数ヶ月ですが、早くもIE9ベータ版がくるかもとか噂がありました。
流石にちょっと早すぎる気がしますが、最近のMSのWebに対する本気っぷりは凄いからなぁ・・・。
そういえば、ちょっと前にWindows Live Wave4のスクリーンショットリークもありましたね。
あぁ、Windows Phone 7 Seriesってのもありましたね・・・。
それとXNA4に関する情報もあるかも。
なんだかんだでお楽しみ情報がいっぱいあるなぁ。
今夜が楽しみ。・・・時間間違えてなければ。
あ、自分はAzureは完全スルーですが何か?
たぶん深夜1時30分か2時30分。
公式サイト行ってストリーミング始まってたら喰い付かなきゃですね。
Silverlight4のRTWもありそうですが、それよりもIE9&HTML5が気になりますね。
PDC09でお披露目されてから数ヶ月ですが、早くもIE9ベータ版がくるかもとか噂がありました。
流石にちょっと早すぎる気がしますが、最近のMSのWebに対する本気っぷりは凄いからなぁ・・・。
そういえば、ちょっと前にWindows Live Wave4のスクリーンショットリークもありましたね。
あぁ、Windows Phone 7 Seriesってのもありましたね・・・。
それとXNA4に関する情報もあるかも。
なんだかんだでお楽しみ情報がいっぱいあるなぁ。
今夜が楽しみ。・・・時間間違えてなければ。
あ、自分はAzureは完全スルーですが何か?
2010-03-11
2010-03-10
久しぶりの更新・・・。
是非伝えておきたいことがありまして・・・。
昨日の朝方のことなのですが、
目覚ましが鳴り、さぁ起きるかと思ったところ・・・
・・・!?
・・・・・・!?
あれれ!???
目が開かない!????
あれれ!???
もしかして・・・目やに!???
目やにで前が見えなぁぁぁい!!
なんだコレはと思いつつ・・・目やにをこすり鏡を見ると・・・
充血しまくってる目が!!(両目)
え!???
これって結膜炎!???
以前も結膜炎になったことはありますが、両目いっきになることってあるの!???
昨日は仕事だったので、充血しきった両目で行きましたが、
案の定ネタにされまくり!!
流行目だと困るので眼科に行けと指令が出て、眼科に行ったのですが、
予想通りの結膜炎でした・・・。
2種類の目薬をもらい付けているのですが、
1日たった今日も目は充血しきったまま・・・。
しまいには何が原因か分かりませんが、
顎に縦ラインの傷が付いていて、アンタッチャブル山崎のケツ顎状態に!!(なにげにこっちの方が早く直って欲しい)
最近の低気圧で鼻炎も悪化してきたし、
最近何かツイてないな・・・。
Jリーグも開幕したのでBIGを購入したけど、半分も当たってないし・・・。ちくしょう。<無関係
是非伝えておきたいことがありまして・・・。
昨日の朝方のことなのですが、
目覚ましが鳴り、さぁ起きるかと思ったところ・・・
・・・!?
・・・・・・!?
あれれ!???
目が開かない!????
あれれ!???
もしかして・・・目やに!???
目やにで前が見えなぁぁぁい!!
なんだコレはと思いつつ・・・目やにをこすり鏡を見ると・・・
充血しまくってる目が!!(両目)
え!???
これって結膜炎!???
以前も結膜炎になったことはありますが、両目いっきになることってあるの!???
昨日は仕事だったので、充血しきった両目で行きましたが、
案の定ネタにされまくり!!
流行目だと困るので眼科に行けと指令が出て、眼科に行ったのですが、
予想通りの結膜炎でした・・・。
2種類の目薬をもらい付けているのですが、
1日たった今日も目は充血しきったまま・・・。
しまいには何が原因か分かりませんが、
顎に縦ラインの傷が付いていて、アンタッチャブル山崎のケツ顎状態に!!(なにげにこっちの方が早く直って欲しい)
最近の低気圧で鼻炎も悪化してきたし、
最近何かツイてないな・・・。
Jリーグも開幕したのでBIGを購入したけど、半分も当たってないし・・・。ちくしょう。<無関係
Utilities
- タグ
- カレンダー
- 最近の更新
- Adsense