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

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

最近の活動(主に業務外)

qiita.com 最近のブログをまとめただけの内容ですが。Qiitaの Advent Calendar はここしばらく恒例になりつつあります。 あと、勉強会など開催しました。 スライド WinFormsからWPFへ from Yamamoto Reki www.slideshare.net 教材ソースコード github.com 個…

Blazor の大部分がASP.NET Core 3.0 のプロジェクトに移動した

すぐにBlazorが使えるという意味ではありませんが、Razorが標準コンポーネントになるのは素直に嬉しいところです。 github.com 機械翻訳ですが、以下の通り BlazorとRazor Componentsプログラミングモデルのほとんどすべてのソースは、ASP.NETの中央コアリポ…

Blazor で PWAを作る

最近C#も良くなってきましたが、Web開発環境も良くなってきました。 いろいろなことができるのは良いことです。 今回はBlazor 0.7.0 で PWA(プログレッシブWebアプリ)を作ってみました。 Blazor 0.7.0 の環境構築はこちらのとおりです。 Blazor 0.7.0 experi…

Blazor を用いたスクリプトレスWebアプリ開発の可能性

Blazor0.6.0を用いたスクリプトレスWebアプリ開発の可能性 from Yamamoto Reki www.slideshare.net という勉強会を職場でやったので、スライドを共有します。 なお、ここに書かれていることは私見で、特定の団体や企業の考えを代表するものではありません。

Blazor 0.6.0 がリリースされましたね

Blazor 0.6.0 experimental release now available | ASP.NET Blog Ver0.6.0ではジェネリック型やテンプレートが使えるようになったようです。

Blazorを使ってみた(3)

腰痛で倒れていました。不甲斐ない…。 どこまで再利用性や汎用性を高められるかと思って、どうせならXAMLでMVVMをするときのように書きたいと考え、 Resources.cshtml などを作り始めています。 @using Foo.Shared; @switch (DataContext) { case User user: <User DataContext=@user></User>…

Blazorを使ってみた(2)…再

役に立つ情報を書けていなかったので1つ前の記事は削除しました。 Blazorに取りつかれて毎晩少しずつコードを書いていると、どんどんコントロールの整理が進んでいきます。今のところ業務的なDBに対するCRUDを行なう画面を作ってもJavaScriptの記述量は0行と…

少し前にみんな大興奮だったBlazorを使ってみた(1)

あんまり入門記事は書かないタイプの人なのですが、たまにはですね。 触ってみたらちょっと書きたくなったのです。 まず、以下を取りそろえます。 VisualStudio2017(最新版 15.8.2)←何でも作るのでフルインストールしてます .NET Core 2.1(最新版 2.1.401) N…

ToArrayを高速化する話

IEnumerable.ToArray() (拡張メソッド)の.NET Frameworkの実装はこちらです。 https://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs,ed118118b642d9d4 要素数が分かるICollectionと分からないIEnumerableで実装を分けるのは実に合…

共用体でGuidすら速くできる

CEDEC2018の傍ら、こんなベンチマークを思いつきで書いていました。 まずは結果からご覧ください。Meanの値から、だいたいSystem.Guidよりも2倍は高速です。 Method Mean Error StdDev ImmutableGuid_In 20.83 us 0.1102 us 0.0977 us ImmutableGuid 22.46 …

CEDEC2018 に行ってきます

本日は完全に余談 会社が3日分の受講料を出してくれたことと、その期間を快く送り出してくださったクライアント(と書いて戦友と読む)の期待に応えるため、CEDEC2018で勉強してこようと思います。 CEDECではまだ時々会える古い知人も居ります。 そういえばM.K…

Rect.Containsもreadonly struct + in で高速化できる

RectとImmutableRectのContainsのベンチマークです。 IsEmptyの判定を排除できればもっと速度が出るのですが、互換性を重視してあえて削除していません。 なんでこれほどRectに拘るかといいますと、仮想化は矩形の判定の塊だからです。仮想化を高速化したい…

C#7.3 in this ValueTuple が速い

C#7.3でこんなベンチマークをしました。 in this ValueTuple の組み合わせが出来ると本当に高速です。 [Benchmark] public void DoubleMaxLegacy() { for(int idx=0 ; idx<10000;idx++) result[idx] = Math.Max((double)(10000 - idx), (double)idx); } [Ben…

最速C #7.x

最速C# 7.x from Yamamoto Reki www.slideshare.netそんな題名で社内勉強会を実施しました。C#7,xになってから、最速&安全なコードの書き方は変化したと思います。

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

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…