イントレ。
2010-03
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を購入したけど、半分も当たってないし・・・。ちくしょう。<無関係
http://tortoisehg.bitbucket.org/
気づいたらリリースされてました。
UIが「退化」してるのはツールキットの仕様だそうで少しガッカリですが、0.9.3よりはずっと使いやすくなってます。
最近になってMQの機能を多用するようになり、Marcurialなしでは辛い状況になってきました。
少数の変更をまずパッチとしてまとめて、ある程度たまったらリビジョン化(コミット)してます。
いつでもパッチをあてる前に戻って修正できるので、コミット後にtypoや細かいミスに気づいてorzという状況を防げます。
MQを使う上で注意しないといけないのが、パッチをgit形式にすること。
標準ではバイナリファイルの比較が行えず、パッチあてたり外したりするとバイナリファイルがロストします。
あとは日本語ファイルを問題なく使えるようになれば言うこと無しなんだけどなぁ。
現状はwin32mbcs使ってるので、linuxでファイル名が化けてます。
こちらはMercurialに問題があるそうで、本家対応待ちなんだとか。
ま、linuxにリポジトリおいてもwindows側に引っ張ってきて使う分には問題がないのですが。
linuxでwin32mbcsって使えるんだろうか・・・?
今度実験してみよう。
気づいたらリリースされてました。
UIが「退化」してるのはツールキットの仕様だそうで少しガッカリですが、0.9.3よりはずっと使いやすくなってます。
最近になってMQの機能を多用するようになり、Marcurialなしでは辛い状況になってきました。
少数の変更をまずパッチとしてまとめて、ある程度たまったらリビジョン化(コミット)してます。
いつでもパッチをあてる前に戻って修正できるので、コミット後にtypoや細かいミスに気づいてorzという状況を防げます。
MQを使う上で注意しないといけないのが、パッチをgit形式にすること。
標準ではバイナリファイルの比較が行えず、パッチあてたり外したりするとバイナリファイルがロストします。
あとは日本語ファイルを問題なく使えるようになれば言うこと無しなんだけどなぁ。
現状はwin32mbcs使ってるので、linuxでファイル名が化けてます。
こちらはMercurialに問題があるそうで、本家対応待ちなんだとか。
ま、linuxにリポジトリおいてもwindows側に引っ張ってきて使う分には問題がないのですが。
linuxでwin32mbcsって使えるんだろうか・・・?
今度実験してみよう。
2010-03-05
2010-03-01
使い勝手いいのでVS2010ばかり使ってるんですが、
折角なので.NET3.5向けにWPFアプリを.NET4に変更したりしてました。
.NET3.5の時はSystem.Data.SQLite(ADO.NET)が原因でClientProfileは駄目だったんだけど、
.NET4 ClientProfileだと大丈夫ですね。
で、今度はそれを.NET3.5に戻したい場合の話。
いくらか手直しするだけで行けました。
具体的には・・・
・ソリューションファイル(.sln)を書き換え
-Microsoft Visual Studio Solution File, Format Version 11.00
-# Visual Studio 2010
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual Studio 2008
ソリューションファイルを書き換えた時点でVS2008で読めるようになるんですが、
ビルドするときツールバージョンがどうとか怒られるので修正。
・プロジェクトファイル(.csproj)を書き換え
-Project ToolsVersion="4.0"
+Project ToolsVersion="3.5"
あとは
・ターゲットフレームワークの修正
・参照アセンブリの修正
・ソースコード微修正
・App.configの修正
この程度で済みました。
.NET4のSystem.Threading.TasksやSystem.Lazy、IEnumerable.Run()なんかは
Reactive Extensions for .NETで賄えました。
C#4.0の機能は使っていたらどうしようもないですが。
C#3.0とC#4.0では型推論の精度が違うのか、明示的にキャストしないと通らないコードとかありました。
あと、App.configでRuntimeVersion=4を指定してたりするとデバッガが起動しません。
useLegacyV2RuntimeActivationPolicyの設定などをしている場合はそれを削除するなどの修正が必要です。
しかし、Rx Frameworkのおかげでずいぶん拍子抜けした格好です。
簡単なパッチで3.5と4.0を行き来出来ますね。
そして、WPF4のテキストレンダリングに目が慣れていると、WPF3のレンダリングに絶望出来ます・・・。
折角なので.NET3.5向けにWPFアプリを.NET4に変更したりしてました。
.NET3.5の時はSystem.Data.SQLite(ADO.NET)が原因でClientProfileは駄目だったんだけど、
.NET4 ClientProfileだと大丈夫ですね。
で、今度はそれを.NET3.5に戻したい場合の話。
いくらか手直しするだけで行けました。
具体的には・・・
・ソリューションファイル(.sln)を書き換え
-Microsoft Visual Studio Solution File, Format Version 11.00
-# Visual Studio 2010
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual Studio 2008
ソリューションファイルを書き換えた時点でVS2008で読めるようになるんですが、
ビルドするときツールバージョンがどうとか怒られるので修正。
・プロジェクトファイル(.csproj)を書き換え
-Project ToolsVersion="4.0"
+Project ToolsVersion="3.5"
あとは
・ターゲットフレームワークの修正
・参照アセンブリの修正
・ソースコード微修正
・App.configの修正
この程度で済みました。
.NET4のSystem.Threading.TasksやSystem.Lazy、IEnumerable.Run()なんかは
Reactive Extensions for .NETで賄えました。
C#4.0の機能は使っていたらどうしようもないですが。
C#3.0とC#4.0では型推論の精度が違うのか、明示的にキャストしないと通らないコードとかありました。
あと、App.configでRuntimeVersion=4を指定してたりするとデバッガが起動しません。
useLegacyV2RuntimeActivationPolicyの設定などをしている場合はそれを削除するなどの修正が必要です。
しかし、Rx Frameworkのおかげでずいぶん拍子抜けした格好です。
簡単なパッチで3.5と4.0を行き来出来ますね。
そして、WPF4のテキストレンダリングに目が慣れていると、WPF3のレンダリングに絶望出来ます・・・。
Utilities
- タグ
- カレンダー
- 最近の更新
- Adsense