SlideShare une entreprise Scribd logo
1  sur  46
Télécharger pour lire hors ligne
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秒以上画面で何も動いていない時に高
  速化は必須
以上

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

Contenu connexe

En vedette

知って得するC# LINQ to Objects編
知って得するC# LINQ to Objects編知って得するC# LINQ to Objects編
知って得するC# LINQ to Objects編
Shota Baba
 
Unity エディタ拡張
Unity エディタ拡張Unity エディタ拡張
Unity エディタ拡張
Shota Baba
 
知って得するUnity エディタ拡張編
知って得するUnity エディタ拡張編知って得するUnity エディタ拡張編
知って得するUnity エディタ拡張編
Shota Baba
 
каталог строительных систем
каталог строительных системкаталог строительных систем
каталог строительных систем
Al Maks
 
Social Recruiting (Beginner)
Social Recruiting (Beginner)Social Recruiting (Beginner)
Social Recruiting (Beginner)
Jeff Waldman
 

En vedette (20)

Better C#の脱却を目指して
Better C#の脱却を目指してBetter C#の脱却を目指して
Better C#の脱却を目指して
 
これからの「async/await」の話をしよう
これからの「async/await」の話をしようこれからの「async/await」の話をしよう
これからの「async/await」の話をしよう
 
Extending the Unity Editor
Extending the Unity EditorExtending the Unity Editor
Extending the Unity Editor
 
async/awaitダークサイド is 何
async/awaitダークサイド is 何async/awaitダークサイド is 何
async/awaitダークサイド is 何
 
知って得するC# LINQ to Objects編
知って得するC# LINQ to Objects編知って得するC# LINQ to Objects編
知って得するC# LINQ to Objects編
 
Unity エディタ拡張
Unity エディタ拡張Unity エディタ拡張
Unity エディタ拡張
 
An other world awaits you
An other world awaits youAn other world awaits you
An other world awaits you
 
Unityとスマートフォンアプリの最適化
Unityとスマートフォンアプリの最適化Unityとスマートフォンアプリの最適化
Unityとスマートフォンアプリの最適化
 
本になりました! ~ チーム開発の教科書 C#によるモダンな開発を実践しよう!
本になりました! ~ チーム開発の教科書 C#によるモダンな開発を実践しよう!本になりました! ~ チーム開発の教科書 C#によるモダンな開発を実践しよう!
本になりました! ~ チーム開発の教科書 C#によるモダンな開発を実践しよう!
 
中の下のエンジニアを脱出するための仕事術
中の下のエンジニアを脱出するための仕事術中の下のエンジニアを脱出するための仕事術
中の下のエンジニアを脱出するための仕事術
 
知って得するUnity エディタ拡張編
知って得するUnity エディタ拡張編知って得するUnity エディタ拡張編
知って得するUnity エディタ拡張編
 
はじめてのUniRx
はじめてのUniRxはじめてのUniRx
はじめてのUniRx
 
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発
 
プログラムを高速化する話
プログラムを高速化する話プログラムを高速化する話
プログラムを高速化する話
 
каталог строительных систем
каталог строительных системкаталог строительных систем
каталог строительных систем
 
Евгений Минченко. Новые предвыборные технологии
Евгений Минченко. Новые предвыборные технологииЕвгений Минченко. Новые предвыборные технологии
Евгений Минченко. Новые предвыборные технологии
 
Zgrow会社概要
Zgrow会社概要Zgrow会社概要
Zgrow会社概要
 
Test1
Test1Test1
Test1
 
Hzz ve ra birlikleri defans
Hzz ve ra birlikleri defansHzz ve ra birlikleri defans
Hzz ve ra birlikleri defans
 
Social Recruiting (Beginner)
Social Recruiting (Beginner)Social Recruiting (Beginner)
Social Recruiting (Beginner)
 

Dernier

Dernier (12)

新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 

C#アプリの高速化web