C#の高速化入門
Upcoming SlideShare
Loading in...5
×
 

C#の高速化入門

on

  • 2,449 views

VSハッカソン倶楽部 非同期勉強会で使用するセッション資料です。 ...

VSハッカソン倶楽部 非同期勉強会で使用するセッション資料です。
http://vshtc.doorkeeper.jp/events/10442

ソースはこちら
https://github.com/moririring/SpeedupDemo

Statistics

Views

Total Views
2,449
Views on SlideShare
2,442
Embed Views
7

Actions

Likes
6
Downloads
19
Comments
2

1 Embed 7

http://s.deeeki.com 7

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
  • ご指摘有難うございます。確かにこの文章では正確性がありませんね。実際キャストよりasを使った方が良いと思うので、文章を考えて修正します。有難うございました。
    Are you sure you want to
    Your message goes here
    Processing…
  • 51ページの「キャストが重いので as を使う」というのは適当な表現ではないですね。キャストが as よりも重くなるのは、キャスト失敗して例外を投げる時です。 参考:http://ufcpp.net/study/csharp/misc_as.html
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

C#の高速化入門 Presentation Transcript

  • 1. C#の高速化入門 Write by 森理 麟 非同期勉強会
  • 2. Myself 森理 麟(@moririring) 職業:ゲームプログラマ HP : moririringのHP ツール :VagrantWin ←NEW! Microsoft MVP forVisual C#(2013.01 –) 2
  • 3. My Community VSハッカソン倶楽部 +Visual Studio勉強会 C++テンプレート完全ガイド読 書会 Unityクリエイターズ IT英語勉強会 ぼちぼちぼっち開発 3
  • 4. アジェンタ はじめに キーワード説明 プロセス スレッド 同期/非同期 コア 高速化 ターンアラウンドタイム スループット レスポンスタイム おわりに 4
  • 5. first はじめに 5
  • 6. はじめに 僕がC#を始めたのは非同期プ ログラムを組みたかったから です。 6
  • 7. はじめに もっとも当時の僕は非同期と いう言葉は知りませんでした。 7
  • 8. はじめに 動き出してからも止めたい。 そのためにはスレッドを使え ば良いのかな?でした。 8
  • 9. はじめに ただあまり詳しくない僕はマ ルチスレッドは高速化するた めの手法だと思っていました。 9
  • 10. はじめに 非同期?高速化?マルチス レッド?はじめにこの当たり のキーワードを説明します。  はじめにの方が長い? 10
  • 11. Process プロセス 11
  • 12. プロセス プロセスとは実行しているプ ログラムの単位 12
  • 13. プロセス 実行中のプロセスはタスクマ ネージャで確認出来る 13
  • 14. プロセス プロセスは実行に必要なもの をまとめて格納するコンテナ 14
  • 15. プロセス プロセスはタスクとかジョブ とも言う。タスクマネージャ というぐらいなので。 15
  • 16. プロセス C#プログラマとしては他の 実行ファイルを起動する時に Processを使う。超使う。 Process.Start("notepad.exe"); 16
  • 17. Thread スレッド 17
  • 18. スレッド スレッドとはプロセスの最小 の実行単位(因みにThreadは 糸のこと) 18
  • 19. スレッド 1つのプロセスが複数のス レッドを持つことが出来る。 これをマルチスレッドという。  引用:++C++; // 未確認飛行 C マルチスレッド (http://ufcpp.net/study/csharp/sp_thread.html) 19
  • 20. スレッド マルチスレッドは同時に処理 を実行出来る  引用:連載.NETマルチスレッド・プログラミング入門 (http://www.atmarkit.co.jp/ait/articles/0503/12/news025.html) 20
  • 21. スレッド スレッドが集まってプロセス を構成する。プロセスもス レッドの一種。原子と分子、フォルダとファ イルのようなニュアンス。 21
  • 22. スレッド マルチプロセスも同じように 同時に実行できる  引用:組み込み分野における「マルチプロセッサ」とは ―― 多 機能・低消費電力の要求にこたえるための技術的要素と課題 (http://www.kumikomi.net/archives/2005/09/15multic.php?page=13) 22
  • 23. スレッド 違いはメモリ。プロセス間で はメモリは共有されない。ス レッド間では共有される。  引用:連載.NETマルチスレッド・プログラミング入門 (http://www.atmarkit.co.jp/ait/articles/0503/12/news025.html) 23
  • 24. まとめ プロセスはプログラムの実行 単位 スレッドはプロセス内に作ら れる処理の単位 1つのプロセスは1以上のス レッドを持つ スレッドもプロセスも複数持 てて、同時に実行できる 24
  • 25. synchronous/ asynchronous 同期/非同期 25
  • 26. 非同期 プログラムの処理には同期と 非同期がある 26
  • 27. 非同期 処理をして結果が返ってくる まで待つのは同期。リレーは 同期。 27
  • 28. 非同期 処理を待たずに次の処理を実 行するのが非同期。玉入れは 非同期。 28
  • 29. 非同期 スレッドと同期、非同期は直 接は関係ない 29
  • 30. 非同期 しかしマルチスレッドは、ス レッド間が常に非同期。  引用:++C++; // 未確認飛行C マルチスレッド (http://ufcpp.net/study/csharp/sp_thread.html) 30
  • 31. 非同期 つまりマルチスレッドは非同 期プログラムと親和性が高い 31
  • 32. Core コア 32
  • 33. コア コアとはCPUの中心部分であ り、実際に処理を行うところ 33
  • 34. コア スレッドやプロセスはコアを 複数使用できる。マルチコア  マルチスレッドとマルチタスクの違い (http://www.ni.com/white-paper/6424/ja/ ) 34
  • 35. コア 但しコアが一つでも、マルチ スレッドは可能。どうやる か?  マルチスレッドとマルチタスクの違い (http://www.ni.com/white-paper/6424/ja/ ) 35
  • 36. コア こう 36
  • 37. コア マルチスレッドにしても処理 が速くなるとは限らない。む しろ遅くなることもある。 37
  • 38. コア シングルコアマルチスレッドは 並行処理、マルチコアマルチス レッドは並列処理。  並行と並列について-並行コンピューティング技法-を読んで (http://www.m-tea.info/2011/03/concurrent-parallel-01.html) 38
  • 39. まとめ プロセス、スレッド 同期、非同期 コア 並列、並行 ↓ マルチスレッドによる非同期 マルチコアによる並列処理 39
  • 40. 高速化
  • 41. 高速化 僕は高速化って「地球にやさ しい」ぐらい矛盾した言葉だ と思っています。 41
  • 42. 高速化 だってCPUは本来超高速です。 3GHzのCPUなら1秒間に30億回動 きます。 そこにプログラマがプログラム で負荷をかけまくって、1万回の ループで10万回の計算をさせた りして遅くします。 そうやって自分で遅くさせた CPUを、自分で遅くなくするの が高速化です。 42
  • 43. turnaround time ターンアラウンドタイム 43
  • 44. ターンアラウ ンドタイム ターンアラウンドタイムとは 処理にかかる総時間のこと 44
  • 45. ターンアラウ ンドタイム 最初の高速化はターンアラン ドタイムの短縮 45
  • 46. ターンアラウ ンドタイム この高速化で最も重要なのが 計測 46
  • 47. ターンアラウ ンドタイム 人間の感覚で速い遅いを判断 しては駄目 47
  • 48. ターンアラウ ンドタイム ストップウォッチを使って ちゃんと計測しよう 48
  • 49. ターンアラウ ンドタイム C#でもストップウォッチ  var sw = Stopwatch.StartNew();  ShallowWork();  Console.WriteLine(sw.Elapsed);  sw.Reset();  sw.Start();  DeepWork();  Console.WriteLine(sw.Elapsed);  sw.Stop();  //00:00:00.0026507  //00:00:05.0886134  但し計測だけならストップウォッチよりプロファイラーの方が便利。(指摘によ り加筆。Thanks to kkamegawa) 49
  • 50. ターンアラウ ンドタイム 大体はパレートの法則(90:10の 法則)が成り立つ  ヴィルフレド・パレート 50
  • 51. ターンアラウ ンドタイム 10%を絞り込めたら、そこの部分 を高速化 IOアクセスの回数を減らしたり、 アルゴリズムを見直したり、事 前に計算してメモリに乗せたり。 C#なら16byte以下のclassをstruct にしたり、キャストが重いので asを使ったり(次ページに削除 理由) 、文字列の連携には StringBuilderを使ったり 51
  • 52. 前ページの取 り消し理由 「キャストが重いのでasを使 う」と書いた所、適当ではない との指摘を受ける。(Thanks to isishizuka!) 例外が発生するケースではキャ ストよりasを使った方が高速化 だけど、10%に絞り込んだ時に キャストをasに直すというのは 適当ではないため(100%確実に 型変換ができる場合はキャスト の方が高速)取り消しました。 52
  • 53. ターンアラウ ンドタイム 奇抜なテクニックで速くなる ことはあまりないかも 地味で手間はかかるが、トラ イアンドエラーを繰り返す 学問には王道しかない ↑引用:森博嗣著「喜嶋先生の静かな世界」 53
  • 54. ターンアラウ ンドタイム 同じ場所が再度遅くなること もよくある 計測結果は実際に動いている 環境に表示したり、ログを残 したり見える化すると良い 54
  • 55. throughput スループット 55
  • 56. スループット スループットとは時間当たり で処理出来る量のこと。 56
  • 57. スループット 次の高速化はスループッドの 増加 57
  • 58. スループット スループットを増やすにはコ アを増やすこと。 58
  • 59. スループット 8分かかったものを4人で処理 すれば2分になる。仕事量が8 分であることには変わりない。 59
  • 60. スループット シングルコアでの並行処理で は速くならない。マルチコア での並列処理をする 60
  • 61. スループット マルチコアプログラムを初め て組んだ時僕はとても驚きま した。 61
  • 62. スループット 地味で手間のかかる高速化を していないのに、びっくりす るぐらい速くなった 62
  • 63. スループット DEMO1 //通常for for (int i = 0; i < 100; i++) { DeepWork(); } //並列実行Paraller.For Parallel.For(0, 100, i => { DeepWork(); }); 63
  • 64. スループット ただ、マルチコアプログラム は実際難しい点も多い。 indexは順番不定 UIスレッド 排他制御 64
  • 65. スループット 注意点はしっかり押さえよう! C# によるプログラミング入門 並列処理ライブラリ <- 岩永さ んとか この後のbiacさんのセッションで も…! MSDN - データとタスクの並列化 における注意点 並列コンピューティングとは何 か 65
  • 66. ポイント ターンアラウンドタイムを減 らし、スループッドを増やせ ば速くなる しかし、速くなってもユー ザーは最終結果がファースト コンタクト 分かりやすく言うと1分を15秒 にしても皆(隣も!) 遅いと言う 66
  • 67. Response time レスポンスタイム 67
  • 68. レスポンスタ イム レスポンスタイムとはアク ションに対してリアクション が返ってくるまでの時間。 68
  • 69. レスポンスタ イム 最後の高速化が、レスポンス タイム、反応の速さの高速化。 69
  • 70. レスポンスタ イム レスポンスタイムを向上する にはマルチスレッドによる非 同期プログラミング 70
  • 71. レスポンスタ イム 非同期にするとフリーズし なくなる。DEMO2 Task.Run(() => { for (int i = 0; i < 100; i++) { DeepWork(); } }); 71
  • 72. レスポンスタ イム しかし待つことは変わらない ケースが殆ど。 72
  • 73. レスポンスタ イム そこで、待つのが気にならな いコントロールでのUI/UX表現 が必須。 73
  • 74. レスポンスタ イム コントロールの中で数少ない ボタンが持っているUI/UXの特 性があると思っています。 コンボボックスが次点? 74
  • 75. レスポンスタ イム アクションに対しての反応が 自分自身でない(ことが多い)の で即時でなくても待ちやすい。 75
  • 76. レスポンスタ イム 他のコントロールはリアク ションが自分自身のため即座 でないと使いにくさを感じる。 DEMO3 76
  • 77. レスポンスタ イム ボタン自体もリアクションと してEnabledをoffにすると分か りやすいし、誤動作防止。 DEMO4 77
  • 78. レスポンスタ イム ボタン表示オフだけより何を しているのかを文字で書くだ けでも印象が違う。 DEMO5 78
  • 79. レスポンスタ イム 特に重要なのが動き。動いてい るコントロールがあれば待ちや すい。  LowWaiYin's Portfolio:http://lwaiyin.wordpress.com/2011/02/25/2d-run- animation/ 79
  • 80. レスポンスタ イム コマンドラインでもキュレッ トが点滅しているので待てる 80
  • 81. レスポンスタ イム ここで大問題。マルチスレッ ドにするとコントロールへの 書き込みが出来ない。 81
  • 82. レスポンスタ イム 対応するにはWPFなら DispacherやWinFormなら Invoke。もしくは TaskSchedulerを使う DEMO6,7 82
  • 83. レスポンスタ イム var uiTask = TaskScheduler.FromCurrentSynchronizationContext(); await Task.Run(() => { for (int i = 0; i < 100; i++) { DeepWork(); new Task(() => progressBar1.Value = i).Start(uiTask); } }); 83
  • 84. レスポンスタ イム さらにプログレスバーにキャ ンセル処理。やっと最初の下 りの実現。 DEMO8 84
  • 85. レスポンスタ イム var uiTask = TaskScheduler.FromCurrentSynchronizationContext(); await Task.Run(() => { for (int i = 0; i < 100; i++) { DeepWork(); if (_cancelToken.IsCancellationRequested) break; new Task(() => progressBar.Value = i).Start(uiTask); } }); private CancellationTokenSource _cancelToken = new CancellationTokenSource(); private void cancelButton_Click(object sender, EventArgs e) { _cancelToken.Cancel(); } 85
  • 86. まとめ ターンアラウンドタイムを減ら す。泥臭いけど王道。 スループットを増やす。マルチ コアによる並列プログラム。 レスポンスタイムを速く。マル チスレッドによる非同期プログ ラム。 レスポンスタイムを速くして、 待つのが気にならないUIを作る 86
  • 87. end おわりに 87
  • 88. おわりに 最後に高速化を比喩で。 高速化はダイエットに似てい ます。 88
  • 89. DEBU! 太ります! 89
  • 90. CHECK!! 測ります!! 90
  • 91. YASE!!! 痩せます!!! 91
  • 92. REBOUND!!!! リバンウンドします!!!! 92
  • 93. BEAUTIFUL!!!!! ごまかします!!!!! 93
  • 94. 参考(一部)  連載.NETマルチスレッド・プログラミング入門  マルチスレッドとマルチタスクの違い  ++C++;// 未確認飛行 C マルチスレッド  意味の違いがわかる? タスクとプロセスとスレッド  避けて通れない「非同期処理」を克服しよう  ++C++;// 未確認飛行 C 並列処理ライブラリ  C# 5.0&VB 11.0新機能「async/await非同期メソッド」入門  並行と並列について-並行コンピューティング技法-を読んで  並列プログラミング入門!&おさらい!  Taskを使って非同期処理  C#5.0のasync/awaitによる非同期処理の使い方  非同期処理でUIスレッドを操作する方法  とあるコンサルタントのつぶやき マルチスレッド Windows フォームアプリケーションの開発  DOBON.NETより高い精度で時間を計測する  VC++まわりの非同期処理  増補改訂版Java言語で学ぶデザインパターン入門マルチスレッド編  @IT, Wikipedia, IT用語辞典, StackOverFlow, 94
  • 95. おわりに 発表するとめちゃめちゃ勉強 になりますよ。皆さんもぜひ 次回しゃべってください! 95
  • 96. おわりに ご清聴ありがとうございまし た 96
  • 97. 今日のソース https://github.com/moririring/Sp eedupDemo 97