Upgrade to Pro — share decks privately, control downloads, hide ads and more …

C#アプリの高速化入門

moririring
December 10, 2011

 C#アプリの高速化入門

2011年12月03日わんくま同盟大阪勉強会#46で話したスピーチです。

moririring

December 10, 2011
Tweet

Other Decks in Technology

Transcript

  1. 自己紹介   森理 麟(moririring) 職業 : プログラマ Twitter : @moririring ブログ

    : 森理 麟(moririring)のプログラマブログ 自作アプリ : クッキツイート
  2. 押せない状態にするソース private void Button_Click(object sender, EventArgs e) { Button.Enabled =

    false;//ボタンを押せない状態にする //重い処理 for(int i = 0; i < 10000000; i++); Button.Enabled = true; //ボタンを押せる状態に戻す }
  3. 処理を表示するソース 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(); }
  4. 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; }
  5. 実装処理の追加 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); } }
  6. 追加処理のソース //ボタンが押されたら 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; }
  7. 実装方法 マルチコアの実装は簡単です。 //このループを for (int i = 0; i <=

    10; i++){処理} ↓ //このように置き換えるだけ Parallel.For(0, 10, i =>{処理}); これだけで驚く程速くなります。
  8. ソース 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; }