C#アプリの高速化web

4,283 views
4,025 views

Published on

わんくま勉強会で話した「C#アプリの高速化入門」をweb用に加筆修正したものです

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
4,283
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
12
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

C#アプリの高速化web

  1. 1. C#アプリの高速化入門森理 麟(moririring)
  2. 2. 自己紹介  森理 麟(moririring)職業 : プログラマTwitter : @moririringブログ : 森理 麟(moririring)のプログラマブログ自作アプリ : クッキツイート
  3. 3. アジェンダ1. 高速化とは2. 遅いとは3. 重いとは4. 速いとは
  4. 4. 1.高速化とは
  5. 5. ダイエットダイエットと高速化は似ています。
  6. 6. 計測どちらも最初に計測が必要です。
  7. 7. 痩せる適切な方法でサイズを痩せる必要があります。
  8. 8. リバウンド痩せてもリバウンドすることがあります。
  9. 9. おしゃれうまくいかなければおしゃれでごまかしましょう
  10. 10. まとめ速くするのは大変です。速くするだけが高速化ではありません。遅くしないことも高速化です。遅く感じさせないことも高速化です。
  11. 11. 2.遅いとはWhat slow does it mean ?
  12. 12. 遅いとは遅いとはどういうことでしょうか?
  13. 13. 遅いとは遅いとはアクションからリアクションまでの時間が遅いことです。
  14. 14. 遅い処理はまとめる遅い処理はボタンにまとめてしまいましょう。
  15. 15. 遅い処理を分かりやすくする押したら、押せない状態にしましょう。
  16. 16. 押せない状態にするソースprivate void Button_Click(object sender, EventArgs e){ Button.Enabled = false; //ボタンを押せない状態にする //重い処理 for(int i = 0; i < 10000000; i++); Button.Enabled = true; //ボタンを押せる状態に戻す}
  17. 17. デモ1DEMO1
  18. 18. デモ…押せない状態にしました。でも…
  19. 19. 処理中を表示する次は別ウィンドウで「処理中」を表示しましょう。
  20. 20. 処理を表示するソース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();}
  21. 21. デモ2DEMO2
  22. 22. まとめ● 遅いとはアクションからリアクションまでの 時間が遅いこと● 遅い処理はボタンにまとめる● ボタンを押したら、押せない状態にする● 別ウィンドウで表示すれば目立つ
  23. 23. 3.重いとは?What heavy does it mean?
  24. 24. 重いとは?重いとはアクションからリアクションの間に操作ができなくなることです。
  25. 25. マルチスレッド重くても、操作ができる方法があります。それがマルチスレッドです。
  26. 26. BackgroundWorkerBackgroundWorkerコンポーネントを使えば、比較的簡単にマルチスレッド化が出来ます。
  27. 27. 処理を分けるポイントは処理を3つの関数に分けることです。開始、実装、終了です。
  28. 28. 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;}
  29. 29. デモ3DEMO3
  30. 30. さらにBackgroundWorkerマルチスレッドしかできない表現があります。それが進行状況の表示とキャンセルです。
  31. 31. 実装処理の追加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); }}
  32. 32. 追加処理のソース//ボタンが押されたら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;}
  33. 33. デモ4DEMO4
  34. 34. まとめ● 重いとはアクションからリアクションまでの間に 操作ができなるくなること● 重い場合はマルチスレッドにする● BackgroundWorkerでマルチスレッド● 進行状況の表示とキャンセルも可能
  35. 35. 4.速いとは?What fast does it mean?
  36. 36. 速いとは?速いとは決められた時間で沢山が処理が出来ることです。
  37. 37. 速くするにはVisualC#2010は、ものすごく簡単に沢山処理させる方法があります。それがマルチコアです。
  38. 38. 実装方法マルチコアの実装は簡単です。//このループをfor (int i = 0; i <= 10; i++){処理}↓//このように置き換えるだけParallel.For(0, 10, i =>{処理});これだけで驚く程速くなります。
  39. 39. デモ5DEMO5
  40. 40. 但し実装的には置き換えだけで行けるのですが、描画の際は気をつけることがあります。
  41. 41. デモ5(失敗バージョン)DEMO5 Failed Version.
  42. 42. マルチコアソースParallel.For(0, 10, i =>{ System.Threading.Thread.Sleep(1000); if (backgroundWorker1.CancellationPending) { e.Cancel = true; return; } backgroundWorker1.ReportProgress(i);});
  43. 43. ソースstatic int conuter = 0;private void button1_Click(object sender, EventArgs e){ conuter = 0; backgroundWorker1.RunWorkerAsync();}private void backgroundWorker1_ProgressChanged(objectsender, ProgressChangedEventArgs e){ conuter++; toolStripProgressBar1.Value = conuter;}
  44. 44. まとめ● 速いとは決められた時間内で沢山処理 が出来ること● VisualC#2010なら簡単マルチコア● ループをParalle.Forにするだけ● 但しインデックスナンバーに気をつける
  45. 45. 総括● 高速化は速くすることだけではない● マルチスレッドならBackgroundWorker● マルチコアならVisualC#2010● 3秒以上画面で何も動いていない時に高 速化は必須
  46. 46. 以上ご清聴ありがとうございました

×