$30 off During Our Annual Pro Sale. View Details »
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
Microsoft Agent 365 を 30 分でなんとなく理解する
skmkzyk
1
490
Agents IA : la nouvelle frontière des LLMs (Tech.Rocks Summit 2025)
glaforge
0
470
最近のLinux普段づかいWaylandデスクトップ元年
penguin2716
1
560
Symfony AI in Action
el_stoffel
2
390
Modern Data Stack大好きマンが語るSnowflakeの魅力
sagara
0
300
グレートファイアウォールを自宅に建てよう
ctes091x
0
130
直接メモリアクセス
koba789
0
250
20251209_WAKECareer_生成AIを活用した設計・開発プロセス
syobochim
1
390
.NET 10 のパフォーマンス改善
nenonaninu
2
4.9k
AI/MLのマルチテナント基盤を支えるコンテナ技術
pfn
PRO
5
780
HIG学習用スライド
yuukiw00w
0
110
21st ACRi Webinar - Univ of Tokyo Presentation Slide (Ayumi Ohno)
nao_sumikawa
0
120
Featured
See All Featured
Thoughts on Productivity
jonyablonski
73
5k
Producing Creativity
orderedlist
PRO
348
40k
A Modern Web Designer's Workflow
chriscoyier
697
190k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
37
2.6k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Embracing the Ebb and Flow
colly
88
4.9k
[RailsConf 2023] Rails as a piece of cake
palkan
58
6.1k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.3k
Practical Orchestrator
shlominoach
190
11k
Java REST API Framework Comparison - PWX 2021
mraible
34
9k
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秒以上画面で何も動いていない時に高 速化は必須
以上 ご清聴ありがとうございました