SlideShare a Scribd company logo
1 of 46
Download to read offline
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秒以上画面で何も動いていない時に高
  速化は必須
以上

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

More Related Content

Viewers also liked

知って得する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
 

Viewers also liked (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)
 

Recently uploaded

研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
atsushi061452
 

Recently uploaded (16)

クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑
クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑
クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑
 
Intranet Development v1.0 (TSG LIVE! 12 LT )
Intranet Development v1.0 (TSG LIVE! 12 LT )Intranet Development v1.0 (TSG LIVE! 12 LT )
Intranet Development v1.0 (TSG LIVE! 12 LT )
 
MPAなWebフレームワーク、Astroの紹介 (その1) 2024/05/17の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その1) 2024/05/17の勉強会で発表されたものです。MPAなWebフレームワーク、Astroの紹介 (その1) 2024/05/17の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その1) 2024/05/17の勉強会で発表されたものです。
 
Hyperledger Fabricコミュニティ活動体験& Hyperledger Fabric最新状況ご紹介
Hyperledger Fabricコミュニティ活動体験& Hyperledger Fabric最新状況ご紹介Hyperledger Fabricコミュニティ活動体験& Hyperledger Fabric最新状況ご紹介
Hyperledger Fabricコミュニティ活動体験& Hyperledger Fabric最新状況ご紹介
 
20240523_IoTLT_vol111_kitazaki_v1___.pdf
20240523_IoTLT_vol111_kitazaki_v1___.pdf20240523_IoTLT_vol111_kitazaki_v1___.pdf
20240523_IoTLT_vol111_kitazaki_v1___.pdf
 
LoRaWAN無位置ロープ型水漏れセンサー WL03A-LB/LSカタログ ファイル
LoRaWAN無位置ロープ型水漏れセンサー WL03A-LB/LSカタログ ファイルLoRaWAN無位置ロープ型水漏れセンサー WL03A-LB/LSカタログ ファイル
LoRaWAN無位置ロープ型水漏れセンサー WL03A-LB/LSカタログ ファイル
 
論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation
論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation
論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation
 
Keywordmap overview material/CINC.co.ltd
Keywordmap overview material/CINC.co.ltdKeywordmap overview material/CINC.co.ltd
Keywordmap overview material/CINC.co.ltd
 
情報を表現するときのポイント
情報を表現するときのポイント情報を表現するときのポイント
情報を表現するときのポイント
 
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
 
部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員
部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員
部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員
 
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一
 
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
 
2024年5月17日 先駆的科学計算フォーラム2024 機械学習を用いた新たなゲーム体験の創出の応用
2024年5月17日 先駆的科学計算フォーラム2024 機械学習を用いた新たなゲーム体験の創出の応用2024年5月17日 先駆的科学計算フォーラム2024 機械学習を用いた新たなゲーム体験の創出の応用
2024年5月17日 先駆的科学計算フォーラム2024 機械学習を用いた新たなゲーム体験の創出の応用
 
ネットワーク可視化 振る舞い検知(NDR)ご紹介_キンドリル202405.pdf
ネットワーク可視化 振る舞い検知(NDR)ご紹介_キンドリル202405.pdfネットワーク可視化 振る舞い検知(NDR)ご紹介_キンドリル202405.pdf
ネットワーク可視化 振る舞い検知(NDR)ご紹介_キンドリル202405.pdf
 
ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521
ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521
ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521
 

C#アプリの高速化web