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

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

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

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

.NET 4.6 hotfix

https://support.microsoft.com/en-us/kb/3088957Issue 4でここ2回の日記で問題にしていた件が解消しているようです。GC内部で長時間フリーズする問題です。

VS2015がフリーズするので

devenv.exe.configにgcServerを有効にする1行を加えたら素晴らしい安定。hotfix待ちの方々に福音として。http://blogs.microsoft.co.il/dorony/2015/08/08/beware-of-net-4-6-workstation-gc/理由はこちらにて。

DLL-hellという言葉を思い出す

きっかけは、VS2015でビルドしたプログラムが30秒もフリーズした事でした。dotTraceでGCがぶんぶん回ってるのを見て、検索したところ、こんな話に当たりました。http://stackoverflow.com/questions/32048094/net-4-6-and-gc-freezeそこのリンクによるとhttp…

昨日の勉強会

やっと、WPF高速化ネタの一番大きいものをオープンにしました。昨晩の勉強会です。資料は近日スライドシェア予定です。ソースコードも公開予定です。手加減一切無し。ただ高速に動くためのWPFコーディングパターンです。消極的な戦術で逃げ切れない時はどう…

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

新しい糖衣構文が出てきたら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,>…

最近チェックした記事

デリゲートのパフォーマンスhttp://qiita.com/Temarin_PITA/items/d851e101cbce6dd92d86久々にこれはビックリしました。ラムダのあれは糖衣構文だと思い込んでいました。久々にしてやられた感じです。勉強させていただきました。

完成度の高い開発環境について

完成した、完成度の高い開発環境とはなんでしょうか。 諸説ありますが、個人的には以下の表現が可能なものだと思っています。 「XはXで自己定義可能」 例えば、C言語のコンパイラはC言語で制作可能です。D言語もC#もJavaも可能です。 プログラミング言語に限…

WindowsFormsHostとGridSplitterのねばねばした関係

全ての画面を作るというわけにいかないプロジェクトもあるので、WindowsFormsHostをグリッド上に配置するというケースも時々あるかと思います。 そんなときに、GridSplitterを入れるとWindowsFormsのコントロールが酷い描画をするという話はよく聞きます。 …

Msを16倍出し抜くC#+WPFの3回目(その前に)

スライドがどうも整ってないのでまだ公には出してないのですが。今までくどくどと挙げてきたWPFボトルネックを全部避けてみるだけで、実際どの位速いパネルが生まれるのかというあたりをデモしました。その時にちょっとおまけ話としてイベントの発射地点につ…

Thickness = 1の線分がどのくらい遅いか試すコード

WPF Benchmark WPF Benchmark - Source Code私がここ数日言っていたことは、ここのコードでそのまま試せます。 走らせながら、太さを調整してみるとわかると思います。 モニターのデフォルト倍率によって多少変化しますが、要は実描画時に何ピクセルの太さに…

高速な線分描画とか2

存分に強いグラフィックチップが有っても、太さ約1.7pxくらいが一番速いようです。グラフィックチップの種類はあまり問わず似たような性能曲線。 GPUの力もある程度働いているようです。でもCPU側が少々過剰でアンバランスです。そろそろMicrosoftに問い合わ…

高速な線分描画とか

あんまりショッキングな書き方をしたくありませんので、現時点ではある開発機で発生した事象として記載します。始点終点がランダムである場合、線の太さが√3に近いほど高速になるという実測データを得ました。大まかに言いますと 最速は 1.71px~1.74pxくら…

delegate + ref が速いケース

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

仮想化しないでも速いCanvasの作り方

XAML Advent Calendar 2014 - Qiita XAML Advent Calendar 2014 - Qiita こちら向けの記事です。1日遅刻しました。ごめんなさい。 あちこちで書いて回っておりますがPanel.Childrenがとても重いのです。 遅い原因はこちら。 http://referencesource.microsof…

FreezableにDataContextが伝播する仕掛け(その2)

素早く実証コードを書いてみました。 ViewModelとしては概ねこんな感じ using System; using System.Windows; using System.Windows.Input; using System.Diagnostics; namespace WpfApplication1 { class MainWindowViewModel : DependencyObject { public …

FreezableにDataContextが伝播する仕掛け(その1)

依存関係プロパティ(継承タイプ)を変更しますと。 このあたりをスタート地点としまして。http://referencesource.microsoft.com/#WindowsBase/Base/System/Windows/DependencyObject.cs,1243長い処理を経てここに到達します。http://referencesource.micro…

ベジェ曲線のHitTest

WPFにあまり任せてはいけないのがベジェ曲線のHitTestです。 几帳面で抜け目ありませんが、きわめて低速です。真面目に方程式を解く手法ももちろんあるのですが、実はあんまり工夫しないでも、そこそこに優良なコードは書けます。 概ねこんなノリです。動か…

MSを16倍出し抜くなんとか2回目

Msを16倍出し抜くwpf開発2回目 先日やった勉強会資料2回目です。 簡素な仮想化パネルの元資料です。

参加したくて

http://qiita.com/advent-calendar/2014/xamlこれに参加したくて、思わずTwitterアカウントを拵えてしまいました。 @proprogrammer0 ああ、やってしまいましたな。という気分です。

Microsoftを16倍出し抜くC#+WPF開発手法(1回目)

Msを16倍出し抜くwpf開発1回目 from cct-inc 少し前にやった、勉強会の資料です。

続・ハッシュコードをバラけさせる意味はあるのか

というわけで、.NET Frameworkのご本尊様を調べてみたのですが。http://referencesource.microsoft.com/#mscorlib/system/collections/generic/dictionary.cs,290このコードを見る限り、GetHashCode()は別にバラケさせる必要はありませんね。 コスト比皆無で…

ハッシュコードをバラけさせる意味はあるのか

随分間が空きました。やっとプロジェクトが節目っぽいので再開します。ハッシュコードについてよく言われることがあります。また、条件と言われるものがあります。 同じインスタンスは常に同じ値を返さなければならない 異なるインスタンスが同じ値を返すこ…

久々に綺麗なMVVM

しばらく、速さに特化したコードばかり書いていたので美しく構成された正統派のMVVMを書くと心が和みますね。

イベント集約という手法

一長一短あります。 本日はイベント集約のこと。イベントは大変便利ですが、1つのイベントにどの程度のリスナーが居るかを正確に管理するのは大切です。WPFを手本にすると、バインディングパスとレイアウトパスに関して見事なイベント集約がなされているこ…

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

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

体調不良の原因

昨日まで元気だったのに今日突然熱が出て(最近多い)、ちょっと生活を振り返ってみました。食生活はちょっと多いけど普通。酒量もさほどでもなし。(本人の主観によるものです。) 睡眠はやや不足気味。 他の色々はようやくピークを越えて落ち着き始めたと…

簡素な仮想化パネル

こんなXAML <Window x:Class="Test.FastCanvas.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:Test.FastCanvas" Title="MainWindow" Height="350" Width="525"> </window>

実は最近、Visualを細切れにしたらいいんじゃないかと思い

最近まで、よりも速い仮想化パネルを作るということに心血注いでいて一段落ついたところなのですが、まだいくつかやり残したことがあります。というのは、あるチューニング中の出来事で、再描画領域がパネルの左上から右下まで突き抜けているベジェを変更す…