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
マルチプロダクト×マルチテナントを支えるモジュラモノリスを中心としたアソビューのアーキテクチャ
disc99
1
550
Backlog AI アシスタントが切り開く未来
vvatanabe
1
140
Rubyの国のPerlMonger
anatofuz
3
740
はじめての転職講座/The Guide of First Career Change
kwappa
4
4k
UDDのススメ - 拡張版 -
maguroalternative
1
570
마라톤 끝의 단거리 스퍼트: 2025년의 AI
inureyes
PRO
1
750
Telemetry APIから学ぶGoogle Cloud ObservabilityとOpenTelemetryの現在 / getting-started-telemetry-api-with-google-cloud
k6s4i53rx
0
150
Amazon Q Developerを活用したアーキテクチャのリファクタリング
k1nakayama
2
210
Jamf Connect ZTNAとMDMで実現! 金融ベンチャーにおける「デバイストラスト」実例と軌跡 / Kyash Device Trust
rela1470
1
200
【CEDEC2025】『Shadowverse: Worlds Beyond』二度目のDCG開発でゲームをリデザインする~遊びやすさと競技性の両立~
cygames
PRO
1
370
AIのグローバルトレンド 2025 / ai global trend 2025
kyonmm
PRO
1
140
生成AIによるデータサイエンスの変革
taka_aki
0
3k
Featured
See All Featured
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
Designing for Performance
lara
610
69k
The Cost Of JavaScript in 2023
addyosmani
51
8.8k
A Tale of Four Properties
chriscoyier
160
23k
Music & Morning Musume
bryan
46
6.7k
jQuery: Nuts, Bolts and Bling
dougneiner
63
7.8k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
18
1.1k
Balancing Empowerment & Direction
lara
1
540
Optimizing for Happiness
mojombo
379
70k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
358
30k
Facilitating Awesome Meetings
lara
54
6.5k
GraphQLとの向き合い方2022年版
quramy
49
14k
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秒以上画面で何も動いていない時に高 速化は必須
以上 ご清聴ありがとうございました