C#+WPFチューニング戦記

C#とWPFで高速なコードと最適なシステムを書くためにやってきたいろいろな事を書いてみます。.NET Frameworkのソースコードを読み解きましょう。なお、ここに書かれているのは個人の見解であって何らかの団体や企業の見解を代表するものではありません。

IL

値型のデフォルトコンストラクタのコスト

C#における struct は引数が無いコンストラクタを書くことができないのですが、return new Size();こういうのはコスト0で戻り値に格納してくれるのだろうかという疑問について、調査しました。 極めて厳密に最適化をすると、このコンストラクタはインライン…

パフォーマンスが落ちていないことを確認する大切な作業

新しい糖衣構文が出てきたらILの品質を確認しましょう。 VisualStudio 2015のC#では以下のように同じようなプロパティを記述できます。 class Test{ int Value1{ get; set; } = 100; int _value2 = 100; int Value2 { get{ return _value2; } set{ _value2 =…

デリゲートの最適化にもう1歩踏み込む

デリゲートの最適化についてはもう1歩踏み込んでみたいと思います。 下記のようなコードをビルドしてみると /// <summary> /// string.IsNullOrWhiteSpace /// </summary> static Func<string, bool> stringIsNullOrWhiteSpace = string.IsNullOrWhiteSpace; static void Main(string[] args)</string,>…

delegate + ref が速いケース

foreachで12bytes程度以上の値型配列をループするより、delegateでref型を受ける形のループの方が速いのですね。具体的な根拠は Measure It ですが。 Measure It - Home明示的に delegate って書かないといけないところがちょっと苦しいですが。 ILコード的…

foreachのILとループのパターン

糖衣構文としてとても有名なforeachはおおまかに2種類のILになる可能性があります。 配列に対するIL(for文とほぼ同等) IEnumerable になる IL ループだけの速度では前者が約2倍速です。 IEnumerator が IDisposable なので IEnumerableは try - finally で…

enumはenum以外の用途で使うと遅いのは何故か

enumは糖衣構文です。実態はclass Enumです。 このEnumはenumの本分を尽くす限りにおいては高速です。 しかし、C/C++におけるenumとは根本的に異なっており、int等へのキャストは高速なのに、GetHashCode等のクリティカルなシーンにおいて非常に低速な実装を…

callとcallvirtの違いとstructとinterfaceの関係

List<T>の話は具体的なILの話に続いていきます。 ILに変換された後にcallであるかcallvirtであるか、という違いは案外大きいようです。 callである場合、現時点の .NET Frameworkは比較的積極的な最適化を行ってくれます。一方callvirtになる場合の最適化は消極</t>…

List<T>の話

困ったことにList<T>を最近使いたくありません。 List<T>の場合.NET Framework 4.5 時点でいまだに for と foreach では、 forが高速に組めます。 コンパイラやJITの最適化が進化すれば同じ速度になるかと思いきや、いつまで経っても foreachの方が遅いのです。 あ</t></t>…