Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
C#アプリの高速化入門
Search
moririring
December 10, 2011
Technology
2
1k
C#アプリの高速化入門
2011年12月03日わんくま同盟大阪勉強会#46で話したスピーチです。
moririring
December 10, 2011
Tweet
Share
Other Decks in Technology
See All in Technology
結局QUICで通信は速くなるの?
kota_yata
6
7k
風が吹けばWHOISが使えなくなる~なぜWHOIS・RDAPはサーバー証明書のメール認証に使えなくなったのか~
orangemorishita
15
5.8k
Segment Anything Modelの最新動向:SAM2とその発展系
tenten0727
0
780
Rubyの国のPerlMonger
anatofuz
3
740
AIに目を奪われすぎて、周りの困っている人間が見えなくなっていませんか?
cap120
1
640
UDDのススメ - 拡張版 -
maguroalternative
1
560
AI時代の大規模データ活用とセキュリティ戦略
ken5scal
0
140
ZOZOTOWNの大規模マーケティングメール配信を支えるアーキテクチャ
zozotech
PRO
0
350
AIのグローバルトレンド 2025 / ai global trend 2025
kyonmm
PRO
1
140
LLMで構造化出力の成功率をグンと上げる方法
keisuketakiguchi
0
840
React Server ComponentsでAPI不要の開発体験
polidog
PRO
0
260
「AIと一緒にやる」が当たり前になるまでの奮闘記
kakehashi
PRO
3
150
Featured
See All Featured
Visualization
eitanlees
146
16k
Fireside Chat
paigeccino
38
3.6k
Why You Should Never Use an ORM
jnunemaker
PRO
58
9.5k
VelocityConf: Rendering Performance Case Studies
addyosmani
332
24k
Writing Fast Ruby
sferik
628
62k
The Cost Of JavaScript in 2023
addyosmani
51
8.8k
Fantastic passwords and where to find them - at NoRuKo
philnash
51
3.4k
Navigating Team Friction
lara
188
15k
Become a Pro
speakerdeck
PRO
29
5.5k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
Into the Great Unknown - MozCon
thekraken
40
2k
[RailsConf 2023] Rails as a piece of cake
palkan
56
5.8k
Transcript
C#アプリの高速化 入門 森理 麟(moririring)
自己紹介 森理 麟(moririring) 職業 : プログラマ Twitter : @moririring ブログ
: 森理 麟(moririring)のプログラマブログ 自作アプリ : クッキツイート
アジェンダ 1. 高速化とは 2. 遅いとは 3. 重いとは 4. 速いとは
1.高速化とは
ダイエット ダイエットと高速化は似ています。
計測 どちらも最初に計測が必要です。
痩せる 適切な方法でサイズを痩せる必要があります。
リバウンド 痩せてもリバウンドすることがあります。
おしゃれ うまくいかなければおしゃれでごまかしましょう
まとめ 速くするのは大変です。 速くするだけが高速化ではありません。 遅くしないことも高速化です。 遅く感じさせないことも高速化です。
2.遅いとは What slow does it mean ?
遅いとは 遅いとはどういうことでしょうか?
遅いとは 遅いとはアクションからリアクションまでの 時間が遅いことです。
遅い処理はまとめる 遅い処理はボタンにまとめてしまいましょう。
遅い処理を分かりやすくする 押したら、押せない状態にしましょう。
押せない状態にするソース private void Button_Click(object sender, EventArgs e) { Button.Enabled =
false;//ボタンを押せない状態にする //重い処理 for(int i = 0; i < 10000000; i++); Button.Enabled = true; //ボタンを押せる状態に戻す }
デモ1 DEMO1
デモ… 押せない状態にしました。でも…
処理中を表示する 次は別ウィンドウで「処理中」を表示しましょう。
処理を表示するソース private void Button_Click(object sender, EventArgs e) { Form2 form
= new Form2(); form.Show(); //モーダルダイアログ //重い処理 for(int i = 0; i < 10000000; i++) { form.Update(); }; form.Close(); }
デモ2 DEMO2
まとめ • 遅いとはアクションからリアクションまでの 時間が遅いこと • 遅い処理はボタンにまとめる • ボタンを押したら、押せない状態にする • 別ウィンドウで表示すれば目立つ
3.重いとは? What heavy does it mean?
重いとは? 重いとはアクションからリアクションの間に 操作ができなくなることです。
マルチスレッド 重くても、操作ができる方法があります。 それがマルチスレッドです。
BackgroundWorker BackgroundWorkerコンポーネントを使えば、 比較的簡単にマルチスレッド化が出来ます。
処理を分ける ポイントは処理を3つの関数に分けることです。 開始、実装、終了です。
3つに分けたソース private void button1_Click(object sender, EventArgs e) { button1.Enabled =
false; backgroundWorker1.RunWorkerAsync(); } private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { for(int i = 0; i < 10000000; i++); } private void backgroundWorker1_RunWorkerCompleted(object sender, DoWorkEventArgs e) { button1.Enabled = true; }
デモ3 DEMO3
さらにBackgroundWorker マルチスレッドしかできない表現があります。 それが進行状況の表示とキャンセルです。
実装処理の追加 private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { for (int
i = 1; i <= 10; i++) { System.Threading.Thread.Sleep(1000); //キャンセル処理されたかチェック if (backgroundWorker1.CancellationPending) { e.Cancel = true; return; } //進行状況を渡す backgroundWorker1.ReportProgress(i); } }
追加処理のソース //ボタンが押されたら private void CancelButton_Click(object sender, EventArgs e) { toolStripProgressBar1.Visible
= false; CancelButton.Enabled = false; //キャンセル処理 backgroundWorker1.CancelAsync(); } //進行状況の表示 private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) { toolStripProgressBar1.Value = e.ProgressPercentage; }
デモ4 DEMO4
まとめ • 重いとはアクションからリアクションまでの間に 操作ができなるくなること • 重い場合はマルチスレッドにする • BackgroundWorkerでマルチスレッド • 進行状況の表示とキャンセルも可能
4.速いとは? What fast does it mean?
速いとは? 速いとは決められた時間で沢山が処理が出来 ることです。
速くするには VisualC#2010は、ものすごく簡単に沢山処理さ せる方法があります。 それがマルチコアです。
実装方法 マルチコアの実装は簡単です。 //このループを for (int i = 0; i <=
10; i++){処理} ↓ //このように置き換えるだけ Parallel.For(0, 10, i =>{処理}); これだけで驚く程速くなります。
デモ5 DEMO5
但し 実装的には置き換えだけで行けるのですが、 描画の際は気をつけることがあります。
デモ5 (失敗バージョン) DEMO5 Failed Version.
マルチコアソース Parallel.For(0, 10, i => { System.Threading.Thread.Sleep(1000); if (backgroundWorker1.CancellationPending) {
e.Cancel = true; return; } backgroundWorker1.ReportProgress(i); });
ソース static int conuter = 0; private void button1_Click(object sender,
EventArgs e) { conuter = 0; backgroundWorker1.RunWorkerAsync(); } private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) { conuter++; toolStripProgressBar1.Value = conuter; }
まとめ • 速いとは決められた時間内で沢山処理 が出来ること • VisualC#2010なら簡単マルチコア • ループをParalle.Forにするだけ • 但しインデックスナンバーに気をつける
総括 • 高速化は速くすることだけではない • マルチスレッドならBackgroundWorker • マルチコアならVisualC#2010 • 3秒以上画面で何も動いていない時に高 速化は必須
以上 ご清聴ありがとうございました