delegateのパフォーマンスコスト
@ITでflamingしている例外とref/outの話を書いてて気づいたのだけど、僕は.NETプログラマーの中ではかなり低レベルな部分をいじっているのかもしれない(低レベルってもちろん技術力の話じゃありませんよ)。それでも、うちのチームの中ではかなり高レベルな部分しかいじってない方だし(icallとか書かないし)、unsafeやstackallocなんてほぼ使わないのだけど。yaneSDKとかその辺を見ていると基準がおかしくなるのかも(w 富豪なプログラマーはrefだのoutだのなんて使わないんだろう。というかWinFormsアプリだのASP.NETアプリだのしか書いていなかった頃の自分が同じことを言われたら、似たような反応をしていたかもしれない。いまDateTime.Parse()とか、ref/outナシで実装しろ、とか言われたらたぶんキレますw
そんな「低レベル」な僕だけど、最近気づいたのは、delegateって案外コストが高いんだなということだった。TextInfoのToUpper(string)とToLower(string)のロジックを、ToUpper(char)とToLower(char)をまとめたdelegateを使って共通化していたんだけど、delegateを使わないようにしただけで1、処理時間が4秒から3.5秒に縮む程度のインパクトがあった。まあ何百万回と呼ばれるToUpper()/ToLower()の実装だったからという話もあるけれど、delegateなんてtypesafeな関数ポインタだろう、くらいの認識しか無かったのでついフツーに使っていた。最適化する時には、delegateを非delegate化することも手段のひとつとして使えると思う。
I love Nemerle
MatzにっきでRubyが一番愛されている言語だ、という話を書かれていたのを思い出して気づいたのだけど、Nemerleはかなり良いセンいけるんじゃないか?と思ってぐぐってみたら…
0件ですた…orz
というわけでここで記念すべき1件目。またもやmeiさんの縄張りを荒らしてみるテストw
コメント
yaneurao — 05/01/2005 16:13:27
.NETのdelegateまわりは最適化が甘いですネ(´ω`)
関数合成のつもりでdelegate使ってると痛い目に遭います。
akiramei — 05/01/2005 18:16:21
例外とref/out
C++からC#へ移行してきた人だとref/outを使うことが多いかも知れませんね。C++でむやみに例外を使っているプログラムをデバッグすることがあったのですが、スタックの消費量がひどくて例外は使いたくないなぁとか敬遠するよーになってしまいました。(^^;
delegate
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dncscol/html/csharp02172004.asp
ここによると、interface経由の呼び出しより3倍くらいは遅そうですね。以前、.NETのライブラリを調べていたときに、メソッドが1つしかないinterfaceならdelegateでいいんじゃないのか?とか思っていたのですが、このパフォーマンスの悪さをみてdelegate使っていないことを納得したものです。(^^;
atsushieno — 05/01/2005 21:27:02
書いてから「あ、もしかしてmonoランタイム固有の問題かも」とか思っていたのですが、MS.NETでも変わらないようですね。
MSDN記事は気づきませんでした。参考になりますです〜
ladybug — 05/06/2005 19:18:23
akirameiさんの書いてるURLのサンプル、実行するたびに結果が違う…。
1回目実行したら、Direct 100% Interface 80% ぐらいだったのが2回目実行したら Interface 100% Direct 90% (つまりインターフェス経由のほうが速い)になって、さらに4回実行したら再び Direct が逆転する!
Footnotes
-
その一部はこちら。 ↩