SlideShare a Scribd company logo
1 of 22
Microsoftを16倍出し抜く 
C#+WPF開発手法 
第2回(1~4倍までの道) 
山本礼貴
誰のためか 
対象者 
 C#と.NET Frameworkに対する大まかな知識を持つ人 
 WPFに対する大まかな知識を持つ人 
 第1回目のスライドをご覧いただいた人には、より効果的な 
動機 
 WPFのプログラムの動作が遅いという懸念や不満
頂上までの道 
WPFの根本的問 
題を解決する 
(16倍~) 
WPF 
を制御する 
(4~16倍) 
WPFを効率的に使う 
(1~4倍) 
誤った使い方をしないこと 
(~1倍)
アジェンダ 
16倍っていかほど? 
仮想化パネル自作という道 
ちょっとしたデモ 
まとめと次回予告
16倍っていかほど? 
大変に思えますが、実のところはそうでもない。 
大体の16倍の根拠について。
大前提 
画面に収まらない規模のデータを扱うときの話です。 
画面に収まる程度ものが遅いというのは何か別の問題と考え 
ましょう。(例えば、第1回目で問題にしたようなこと)
一般論で 
考える 
量的な面から物を減らしていくというアプローチは正しい。 
 データをグルーピングしたり絞り込んだりする。 
 遅延評価する。 
 表示を省略する。表示しないでいいUIを選択する。 
(折りたたんだツリーとか) 
 ただし、これらは多くの場合一覧性に対するアンチかも。 
データ形式に特化されたアプローチの良し悪し 
 再利用性が低いので、毎回毎回やる羽目になります。 
 とはいえ、速くなることは間違いない。 
システマチックなアプローチは大切です。 
 再利用ができるから。 
 簡素なコードが速く動くから。 
 他のアプローチと相乗効果が働くから。
高速化を 
座標軸で 
考える 
システマチックに考えてみましょう。 
我々が認識できる軸は4つしかない 
 画面の平面(X軸、Y軸) 
 コントロールの前後関係(Z軸) 
 描画に要する時間(時間軸) 
だったら、1軸あたり2倍の速度にできたら、2の4乗・・・ 
すなわち16倍。いけそうな気がする。 
そのうち4倍を勝ち取る、画面の平面への最適化。 
それは仮想化パネルそのものじゃないか!
本日のお題 
水平方向の 
高速化 
(1~4倍) 
仮想化パネルって何するの? 
 仮想化パネルとは、画面外にあるものに対して、速度に影響し 
そうな処理を省略するパネルの事です。 
 例)画面内に入る前のコントロールを生成しない 
 例)画面外にあるコントロールをパネルから取り外す 
 例)使用の終わったコントロールをリサイクルする 
 MicrosoftはVirtualizingStackPanelしか用意してくれていません。 
 この圧倒的な不足感は、自作するか、何かを買うしかなさそう 
です。 
 とりあえず、自作する路線にしましょう。 
 買ったものが遅かったとき理由がわかりません。 
 自分でメンテしているものなら大丈夫。
仮想化パネル自作 
という道 
ひとまず簡単に作れる範囲から
知っておくべ 
きこと 
ビジュアルツリーのことは多少知っておくと良い。 
標準の仕様からどこまで離れることを許容しますか? 
最小限、このくらいは変化します。 
 IsVisibleとか、VisualPanrentChangedのようなイベントが発生す 
るタイミングは変わります。 
 Loaded、Unloadedも変わります。 
 Childrenは「今表示されている子」のリストであり、所属して 
いる全ての子を表すようにならなくなります。 
 レイアウトパスの前に、画面外の要素を外したりする必要があ 
ります。 
 つまり、特定のイベント依存で処理をしてはいけません。 
事前に読んでおくべきリファレンスコードはどこか 
 ひとまず、Panel.csとFrameworkElement.csかな。
高速化のため 
にすること 
仮想化はパネルの責務です。でも、コントロールが協力的な 
ら仮想化は高速です。 
(専用のインターフェースくらいならあってもいいかなと思 
える理由) 
まるで、すべてのコントロールが今までと同じように動かな 
ければいけないという考え方は捨てます。 
(遅いものにいつまでもとらわれては速くなりません。) 
レイアウトパスを上手に活用して、適切なタイミングで画面 
外のコントロールを低コスト化してやることです。
ビジュアルツリーの 
居場所はこのあたり 
ビジュアルツ 
リーを知る 
イベント 
ユーザーコー 
ド 
バインディン 
グパス 
レイアウトパ 
ス 
描画パス
例) 
ボタンの 
ビジュアル 
ツリー 
Button 
ClassicBorderDecorator 
(ボタンのスタイル) 
ContentPresenter 
(ボタンの中身) 
StackPanel 
Image TextBlock 
<Button> 
<StackPanel> 
<Image Source=“~.bmp” /> 
<TextBlock> 
ボタン 
<TextBlock/> 
</StackPanel> 
</Button> 
XAMLとイコールではあり 
ませんが、構造は近しいも 
のがあります。
パネル側に 
実装するもの 
子を追加、削除するメソッド 
 Childrenとは別途管理します。 
画面の表示範囲Viewportに応じてコントロールの着脱処理を 
行います。
ちょっとしたデモ 
速度差の体感用です。が、あまり速くなった気がしな 
かったらごめんなさい。それは、次回以降のネタなので 
す。
違い 
初期表示は数十倍は高速 
マウスのあたり判定も数倍高速 
スクロールはちょっと遅い?(←理由は後ほど) 
そんなことはいいから、ちょっとソースを見ましょうか。
たった 
これだけで 
仮想化 
(パネル) 
Children候補を蓄積しといて 
Viewportに入ったら着脱
たったこれだ 
けで(以下略) 
スッカスカです
違反が 
あります 
30分で書いたので、粗はごめんなさい。 
実は1つ重大な違反してます。 
 ScrollChangedはレイアウトパス発のイベントです。そこで、 
子の着脱をするということは、ユーザーコードのパス、バイ 
ンディングパスをやり直す可能性が生じます。 
(第1回目であれほどダメだと言っていたのに) 
スクロールがさほど速くなっていなかったのはこれが理由で 
す。 
仮想化しても思ったほど速くならんなーという人が悩むポイ 
ントでもあります。(重要)
まとめと 
次回予告 
まとめ 
 仮想化パネルは水平方向の速度を向上します。 
 ただし、標準とは異なる挙動をするようになるため、いくつか 
の禁止事項が生じます。 
 速さが最も際立つのは、生成時とヒットテスト 
 コントロールの着脱分、スクロールはちょっと遅くなります。 
次回以降予告 
 コントロールのリサイクリングによって、省メモリと高速化を 
同時に実現します。 
 Panelを継承するから発生する最大の問題について。 
 Zindex問題の解消方法。随一のトリッキーなパネル。
ご清聴ありがとう 
ございました。 
http://proprogrammer.hatenadiary.jp/ 
こちらもご覧ください。

More Related Content

What's hot

今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 TipsTakaaki Suzuki
 
tf,tf2完全理解
tf,tf2完全理解tf,tf2完全理解
tf,tf2完全理解Koji Terada
 
Wpfと非同期
Wpfと非同期Wpfと非同期
Wpfと非同期yone64
 
日本語テストメソッドについて
日本語テストメソッドについて日本語テストメソッドについて
日本語テストメソッドについてkumake
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」Takuto Wada
 
C#でわかる こわくないMonad
C#でわかる こわくないMonadC#でわかる こわくないMonad
C#でわかる こわくないMonadKouji Matsui
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?Moriharu Ohzu
 
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?Yoshitaka Kawashima
 
Pythonによる黒魔術入門
Pythonによる黒魔術入門Pythonによる黒魔術入門
Pythonによる黒魔術入門大樹 小倉
 
イミュータブルデータモデルの極意
イミュータブルデータモデルの極意イミュータブルデータモデルの極意
イミュータブルデータモデルの極意Yoshitaka Kawashima
 
ネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けモノビット エンジン
 
イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化Gosuke Miyashita
 
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話Koichiro Matsuoka
 
目grep入門 +解説
目grep入門 +解説目grep入門 +解説
目grep入門 +解説murachue
 
オブジェクト指向プログラミングのためのモデリング入門
オブジェクト指向プログラミングのためのモデリング入門オブジェクト指向プログラミングのためのモデリング入門
オブジェクト指向プログラミングのためのモデリング入門増田 亨
 
C#とILとネイティブと
C#とILとネイティブとC#とILとネイティブと
C#とILとネイティブと信之 岩永
 
プログラマが欲しい仕様書とは
プログラマが欲しい仕様書とはプログラマが欲しい仕様書とは
プログラマが欲しい仕様書とはKatsutoshi Makino
 
ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装infinite_loop
 
【Unity】 Behavior TreeでAIを作る
 【Unity】 Behavior TreeでAIを作る 【Unity】 Behavior TreeでAIを作る
【Unity】 Behavior TreeでAIを作るtorisoup
 

What's hot (20)

今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips
 
tf,tf2完全理解
tf,tf2完全理解tf,tf2完全理解
tf,tf2完全理解
 
Wpfと非同期
Wpfと非同期Wpfと非同期
Wpfと非同期
 
日本語テストメソッドについて
日本語テストメソッドについて日本語テストメソッドについて
日本語テストメソッドについて
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
 
プログラムを高速化する話
プログラムを高速化する話プログラムを高速化する話
プログラムを高速化する話
 
C#でわかる こわくないMonad
C#でわかる こわくないMonadC#でわかる こわくないMonad
C#でわかる こわくないMonad
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?
 
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
 
Pythonによる黒魔術入門
Pythonによる黒魔術入門Pythonによる黒魔術入門
Pythonによる黒魔術入門
 
イミュータブルデータモデルの極意
イミュータブルデータモデルの極意イミュータブルデータモデルの極意
イミュータブルデータモデルの極意
 
ネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分け
 
イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化
 
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
 
目grep入門 +解説
目grep入門 +解説目grep入門 +解説
目grep入門 +解説
 
オブジェクト指向プログラミングのためのモデリング入門
オブジェクト指向プログラミングのためのモデリング入門オブジェクト指向プログラミングのためのモデリング入門
オブジェクト指向プログラミングのためのモデリング入門
 
C#とILとネイティブと
C#とILとネイティブとC#とILとネイティブと
C#とILとネイティブと
 
プログラマが欲しい仕様書とは
プログラマが欲しい仕様書とはプログラマが欲しい仕様書とは
プログラマが欲しい仕様書とは
 
ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装
 
【Unity】 Behavior TreeでAIを作る
 【Unity】 Behavior TreeでAIを作る 【Unity】 Behavior TreeでAIを作る
【Unity】 Behavior TreeでAIを作る
 

More from cct-inc

帰宅部はじめました エクストリーム帰宅のすすめ
帰宅部はじめました エクストリーム帰宅のすすめ帰宅部はじめました エクストリーム帰宅のすすめ
帰宅部はじめました エクストリーム帰宅のすすめcct-inc
 
勉強会 2015-02-04
勉強会 2015-02-04勉強会 2015-02-04
勉強会 2015-02-04cct-inc
 
勉強会 2014-12-11 (spain)
勉強会 2014-12-11 (spain)勉強会 2014-12-11 (spain)
勉強会 2014-12-11 (spain)cct-inc
 
レース観戦入門
レース観戦入門レース観戦入門
レース観戦入門cct-inc
 
201411 141204212906-conversion-gate01
201411 141204212906-conversion-gate01201411 141204212906-conversion-gate01
201411 141204212906-conversion-gate01cct-inc
 
141126 勉強会 xsdの活用
141126 勉強会 xsdの活用141126 勉強会 xsdの活用
141126 勉強会 xsdの活用cct-inc
 
プログラマへ送る電子工作基礎の基礎
プログラマへ送る電子工作基礎の基礎プログラマへ送る電子工作基礎の基礎
プログラマへ送る電子工作基礎の基礎cct-inc
 
OpenCVの入り口
OpenCVの入り口OpenCVの入り口
OpenCVの入り口cct-inc
 
「社会」から考える ~社会学?のすすめ~
「社会」から考える~社会学?のすすめ~「社会」から考える~社会学?のすすめ~
「社会」から考える ~社会学?のすすめ~cct-inc
 
Parser combinatorってなんなのさ
Parser combinatorってなんなのさParser combinatorってなんなのさ
Parser combinatorってなんなのさcct-inc
 

More from cct-inc (10)

帰宅部はじめました エクストリーム帰宅のすすめ
帰宅部はじめました エクストリーム帰宅のすすめ帰宅部はじめました エクストリーム帰宅のすすめ
帰宅部はじめました エクストリーム帰宅のすすめ
 
勉強会 2015-02-04
勉強会 2015-02-04勉強会 2015-02-04
勉強会 2015-02-04
 
勉強会 2014-12-11 (spain)
勉強会 2014-12-11 (spain)勉強会 2014-12-11 (spain)
勉強会 2014-12-11 (spain)
 
レース観戦入門
レース観戦入門レース観戦入門
レース観戦入門
 
201411 141204212906-conversion-gate01
201411 141204212906-conversion-gate01201411 141204212906-conversion-gate01
201411 141204212906-conversion-gate01
 
141126 勉強会 xsdの活用
141126 勉強会 xsdの活用141126 勉強会 xsdの活用
141126 勉強会 xsdの活用
 
プログラマへ送る電子工作基礎の基礎
プログラマへ送る電子工作基礎の基礎プログラマへ送る電子工作基礎の基礎
プログラマへ送る電子工作基礎の基礎
 
OpenCVの入り口
OpenCVの入り口OpenCVの入り口
OpenCVの入り口
 
「社会」から考える ~社会学?のすすめ~
「社会」から考える~社会学?のすすめ~「社会」から考える~社会学?のすすめ~
「社会」から考える ~社会学?のすすめ~
 
Parser combinatorってなんなのさ
Parser combinatorってなんなのさParser combinatorってなんなのさ
Parser combinatorってなんなのさ
 

Recently uploaded

[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 

Recently uploaded (9)

[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 

Msを16倍出し抜くwpf開発2回目