ものがたり(旧)

atsushieno.hatenablog.com に続く

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化することも手段のひとつとして使えると思う。

*1:その一部はこちら