Slide 1

Slide 1 text

C#アプリの高速化 入門 森理 麟(moririring)

Slide 2

Slide 2 text

自己紹介   森理 麟(moririring) 職業 : プログラマ Twitter : @moririring ブログ : 森理 麟(moririring)のプログラマブログ 自作アプリ : クッキツイート

Slide 3

Slide 3 text

アジェンダ 1. 高速化とは 2. 遅いとは 3. 重いとは 4. 速いとは

Slide 4

Slide 4 text

1.高速化とは

Slide 5

Slide 5 text

ダイエット ダイエットと高速化は似ています。

Slide 6

Slide 6 text

計測 どちらも最初に計測が必要です。

Slide 7

Slide 7 text

痩せる 適切な方法でサイズを痩せる必要があります。

Slide 8

Slide 8 text

リバウンド 痩せてもリバウンドすることがあります。

Slide 9

Slide 9 text

おしゃれ うまくいかなければおしゃれでごまかしましょう

Slide 10

Slide 10 text

まとめ 速くするのは大変です。 速くするだけが高速化ではありません。 遅くしないことも高速化です。 遅く感じさせないことも高速化です。

Slide 11

Slide 11 text

2.遅いとは What slow does it mean ?

Slide 12

Slide 12 text

遅いとは 遅いとはどういうことでしょうか?

Slide 13

Slide 13 text

遅いとは 遅いとはアクションからリアクションまでの 時間が遅いことです。

Slide 14

Slide 14 text

遅い処理はまとめる 遅い処理はボタンにまとめてしまいましょう。

Slide 15

Slide 15 text

遅い処理を分かりやすくする 押したら、押せない状態にしましょう。

Slide 16

Slide 16 text

押せない状態にするソース private void Button_Click(object sender, EventArgs e) { Button.Enabled = false;//ボタンを押せない状態にする //重い処理 for(int i = 0; i < 10000000; i++); Button.Enabled = true; //ボタンを押せる状態に戻す }

Slide 17

Slide 17 text

デモ1 DEMO1

Slide 18

Slide 18 text

デモ… 押せない状態にしました。でも…

Slide 19

Slide 19 text

処理中を表示する 次は別ウィンドウで「処理中」を表示しましょう。

Slide 20

Slide 20 text

処理を表示するソース 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(); }

Slide 21

Slide 21 text

デモ2 DEMO2

Slide 22

Slide 22 text

まとめ ● 遅いとはアクションからリアクションまでの 時間が遅いこと ● 遅い処理はボタンにまとめる ● ボタンを押したら、押せない状態にする ● 別ウィンドウで表示すれば目立つ

Slide 23

Slide 23 text

3.重いとは? What heavy does it mean?

Slide 24

Slide 24 text

重いとは? 重いとはアクションからリアクションの間に 操作ができなくなることです。

Slide 25

Slide 25 text

マルチスレッド 重くても、操作ができる方法があります。 それがマルチスレッドです。

Slide 26

Slide 26 text

BackgroundWorker BackgroundWorkerコンポーネントを使えば、 比較的簡単にマルチスレッド化が出来ます。

Slide 27

Slide 27 text

処理を分ける ポイントは処理を3つの関数に分けることです。 開始、実装、終了です。

Slide 28

Slide 28 text

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; }

Slide 29

Slide 29 text

デモ3 DEMO3

Slide 30

Slide 30 text

さらにBackgroundWorker マルチスレッドしかできない表現があります。 それが進行状況の表示とキャンセルです。

Slide 31

Slide 31 text

実装処理の追加 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); } }

Slide 32

Slide 32 text

追加処理のソース //ボタンが押されたら 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; }

Slide 33

Slide 33 text

デモ4 DEMO4

Slide 34

Slide 34 text

まとめ ● 重いとはアクションからリアクションまでの間に 操作ができなるくなること ● 重い場合はマルチスレッドにする ● BackgroundWorkerでマルチスレッド ● 進行状況の表示とキャンセルも可能

Slide 35

Slide 35 text

4.速いとは? What fast does it mean?

Slide 36

Slide 36 text

速いとは? 速いとは決められた時間で沢山が処理が出来 ることです。

Slide 37

Slide 37 text

速くするには VisualC#2010は、ものすごく簡単に沢山処理さ せる方法があります。 それがマルチコアです。

Slide 38

Slide 38 text

実装方法 マルチコアの実装は簡単です。 //このループを for (int i = 0; i <= 10; i++){処理} ↓ //このように置き換えるだけ Parallel.For(0, 10, i =>{処理}); これだけで驚く程速くなります。

Slide 39

Slide 39 text

デモ5 DEMO5

Slide 40

Slide 40 text

但し 実装的には置き換えだけで行けるのですが、 描画の際は気をつけることがあります。

Slide 41

Slide 41 text

デモ5 (失敗バージョン) DEMO5 Failed Version.

Slide 42

Slide 42 text

マルチコアソース Parallel.For(0, 10, i => { System.Threading.Thread.Sleep(1000); if (backgroundWorker1.CancellationPending) { e.Cancel = true; return; } backgroundWorker1.ReportProgress(i); });

Slide 43

Slide 43 text

ソース 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; }

Slide 44

Slide 44 text

まとめ ● 速いとは決められた時間内で沢山処理 が出来ること ● VisualC#2010なら簡単マルチコア ● ループをParalle.Forにするだけ ● 但しインデックスナンバーに気をつける

Slide 45

Slide 45 text

総括 ● 高速化は速くすることだけではない ● マルチスレッドならBackgroundWorker ● マルチコアならVisualC#2010 ● 3秒以上画面で何も動いていない時に高 速化は必須

Slide 46

Slide 46 text

以上 ご清聴ありがとうございました