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

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

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を細切れにしたらいいんじゃないかと思い

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

また休んでます

セミナー用の資料を書いているためです。 週末くらいに復活したいと思いますが果たして。

ペンはブラシに負けます

ペンは仕掛けが複雑なので、図形を書く際には縁が要らないならブラシだけで書きましょう。場合によっては、四角形を回転拡縮して描いた方が速い事すら有ります。やや極端ですが。余談ですが、最近短いのが多いのは、スマホ端末から書いているからです。

Color.GetHashCode( )は一意ではない

32bitしか情報を持っていないのに、一意なハッシュコードを返さないとは。最近のショックな事例の一つです。

VisualBrushの恐怖を一言で表現する

WPF

Visualの描画範囲が、Direct3Dのテクスチャの最大サイズを超える場合、滲みます。*1 *1:中間バッファがレンダリング命令ではなく、レンダー結果のテクスチャだからです。MSDNの表現だけではそれを汲み取りにくいんですよね。印刷の時とかご注意。

共変性と反変性のこと、無法なobjectを撤廃する事

C#に触れていると嫌でも出てくる共変性と反変性のこと。 これを合理的に扱えずに悩んだことはありますか? そんなあなたにC#的処方。あんまり、ここしばらくリファレンスコードのことばかり書いたので、少しは普通のコードを論理的に綺麗にまとめる手法を提…

数日間休んでいます

社内の勉強会に向けて、ちょっと気張って資料を作っているので、ブログの方を少しだけ休んでいます。 Evernoteに置いてあるネタ帳はまだ多量にあるので、書く時間を見つけては書いていきたいと思っています。

2つの親子関係

タイトルのようなことを書くと、普通はロジカルツリーとビジュアルツリーというのが相場ですが、これは別の話です。 ビジュアルツリーは2つの繋がりを持って初めてビジュアルツリーなのです。 AddVisualChild()で接続される、WPFの描画順序に関わるツリー V…

コピペを極力避けるべき理由

プログラマがコピペを忌むべき理由 あなたがコピペしたコードは、他の人が権利を主張した瞬間に、結合しているすべてのコードの公開を求められるものかもしれません。 あなたがコピペしたコードは、別の人がそこにコピペしたもので、実はどこかのOSSライセン…

RecomputeZState()を読みます

http://referencesource.microsoft.com/#PresentationFramework/src/Framework/System/Windows/Controls/Panel.cs#1001これはPanel.csの一部です。 ZIndexが変更されたり、Panelの子要素が追加される度にこれくらいの処理が行われることを覚えておきましょう…

透過率の変更コストをご存知ですか?

DrawingContextに対する描画では、いろいろコストを考えなければいけないところがあります。 例えば、下記のコードは同じような描画を期待できそうですが、速いのはどちらでしょうか。こちらは、同じTransformのものをまとめています。 DrawingContext dc; f…

Z順序の問題とCanvasの関係について

見たまま記述からはてな書式に切り替えてみました。 考えてみたらこっちのほうがWikiっぽくて使いやすいし軽快ですね。 なんか書くのに時間がかかると思っていたら、それは編集用のパネルが遅いからだった、というわけです。 テキストボックスが遅いとか、や…

VirtualizingStackPanelのコード長いですね

ここのところ毎日ソースコードを読みながら実況中継という気分ですが。1日あたり1クラス程度を読むのを日課にしておりますが、本日は苦戦中です。 PanelがベースになっているVirtualizingPanelを基底クラスに持ちながら、VirtualizingStackPanelあの量の機能…

手遅れ SizeChanged

SizeChangedのイベントは、ちょっと届くのが遅いと思います。 本当の本当に、レイアウトパスも済んだところで届きます。うっかりこのタイミングで他のコントロールのサイズを上書きしてしまうと、またレイアウトパスが走ります。最悪、バインディングパスも…

短いコードを速くする努力とは

まずは短く。次いで速く。そんなお話。このブログにも実証コードはそのうち掲載していきたいところですが、当分はMicrosoftのリファレンスソースコードにリンクする事を主体としようと考えています。多くの現場で経験してきた事ですが、使っているものに対す…

UIElementやFrameworkElementの派生クラスのサイズ

UIElementやFrameworkElementや他のコントロール群。それらのサイズを決めるものは何でしょうか。 WidthやHeightはサイズを決めるものではなく、コントロールの使用者がどのようなサイズを期待しているか、標準の測定ロジック(すなわちMeasure)に知らせる…

85000バイト問題はいまだ健在

ガーベージコレクション(GC)のジェネレーションのことを調べたことはあるでしょうか。 .NET FrameworkのGCは現在3つのジェネレーションがあります。 極めて短期的なオブジェクトを扱うジェネレーション0 ある程度の期間に渡って保持されたオブジェクトのジ…

値型に対する拡張メソッドは、値型のサイズを検討してから

PointとSizeとRectとVectorは業務がら大変高頻度で使うのですが、小さい構造体ながら彼らのIsNaNが馬鹿にならないほど圧迫してきます。とはいっても、10分起動して6億回程度・・・・。 double.IsNaNはRect使用時に2~4回程度、ちょっとした矩形の合成でもや…

半端にLINQを使う悪手の代表例

古式なC#ですと、ループして、条件を絞り込む書き方が一般的でした。 // 例:1 foreach( var item in Items ) { if( item.Value > 10.0 ) { // 何かの処理 } } いやぁ、懐かしい。 LINQの登場(というか、メソッドチェインとラムダ式の導入)によって書き方…

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

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