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
本当に使える?AutoUpgrade の新機能を実践検証してみた
oracle4engineer
PRO
1
140
Uniadex__公開版_20250617-AIxIoTビジネス共創ラボ_ツナガルチカラ_.pdf
iotcomjpadmin
0
160
~宇宙最速~2025年AWS Summit レポート
satodesu
1
1.7k
CI/CD/IaC 久々に0から環境を作ったらこうなりました
kaz29
1
150
Navigation3でViewModelにデータを渡す方法
mikanichinose
0
220
Javaで作る RAGを活用した Q&Aアプリケーション
recruitengineers
PRO
1
100
あなたの声を届けよう! 女性エンジニア登壇の意義とアウトプット実践ガイド #wttjp / Call for Your Voice
kondoyuko
4
370
OpenHands🤲にContributeしてみた
kotauchisunsun
1
390
監視のこれまでとこれから/sakura monitoring seminar 2025
fujiwara3
11
3.8k
第9回情シス転職ミートアップ_テックタッチ株式会社
forester3003
0
210
Wasm元年
askua
0
130
Oracle Audit Vault and Database Firewall 20 概要
oracle4engineer
PRO
3
1.7k
Featured
See All Featured
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
16k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
48
2.8k
Faster Mobile Websites
deanohume
307
31k
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
Writing Fast Ruby
sferik
628
61k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
161
15k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
5
210
Building an army of robots
kneath
306
45k
Visualization
eitanlees
146
16k
KATA
mclloyd
29
14k
How to Think Like a Performance Engineer
csswizardry
24
1.7k
Bootstrapping a Software Product
garrettdimon
PRO
307
110k
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秒以上画面で何も動いていない時に高 速化は必須
以上 ご清聴ありがとうございました