2017/11/12 Optimized C++!

0eb58d770d6e4766150ef7cb6cdce3c7?s=47 Akiko Kawai
November 12, 2017

2017/11/12 Optimized C++!

Japan MVP Community Connection 2017 Autumn
Optimized C++! 最適化の手法集めました 遥佐保
PPTX→http://jyurimaru.info/data/20171112MVPCommunityConnection_OptimizedCpp/20171112_Optimized_cpp_public.pptx

0eb58d770d6e4766150ef7cb6cdce3c7?s=128

Akiko Kawai

November 12, 2017
Tweet

Transcript

  1. Optimized C++! 最適化の手法集めました Haruka Sao Microsoft MVP for Windows Development

    Japan MVP Community Connection 2017 Autumn 2017/11/12 Sun
  2. @hr_sao Microsoft MVP for Windows Development [2010-2017] ebisu_optimized.cpp 2017/3/31-11/9

  3. 今年2017年2月最適化だけを考えた書籍が日本語で出版! ディスカッション会を隔週で開催 で、実際、この内容どうよ?話を参加者と共有

  4. 最適化について考える機会 とにかく実行速度を早くしてくれと言われた なんとなく処理に時間がかかってる気がする そもそも最適化するのが好き(?)

  5. Agenda • プログラムを書き始める前に知るべきこと • 最適化をする直前に考えること • 最適化を実施する時のこと • 最適化技法例

  6. プログラムを書き始める前に 知るべきこと

  7. 速いプログラムは正しいってこと 色んな意見がありますが 「結果的に高速に動くプログラムが良い」 に決まってる →低性能はバグと同じ ただし…

  8. してはいけない事や間違った思い込み1 アセンブラやC言語で書き直す • C++の方が速い • 手書きには限界がある

  9. してはいけない事や間違った思い込み2 良くないアルゴリズムを最適化する • 最初から良いアルゴリズム/ライブラリを採 用しよう • もう既に先駆者がいてます • 後から最適化する →例えば構造化の最適化などは後から無理

  10. してはいけない事や間違った思い込み3 ホットじゃない箇所を必死に最適化する 雰囲気でボトルネックを探す • 実験、計測が全て • 直感だけで最適化に時間をかけないこと

  11. 最適化をする直前に 考えること

  12. 最適化しないといけないなと思った時… 計測することだけが 最適化の効果があり!を証明できる • 計測する、コストを見積もる • どこが、どこまで速くなればいいのか決める • 最適化の前後で計測する

  13. 最適化を実施する時のこと

  14. C++で最適化出来る箇所 1. 文字列 2. アルゴリズム 3. 動的変数割り当て 4. ホットな文 5.

    ライブラリ 6. 探索と整列 7. データ構造 8. I/O 9. 並行性 10.メモリ管理 計測後に、取り組む順番も大事…
  15. C++で最適化出来る箇所 1. 文字列 2. アルゴリズム 3. 動的変数割り当て 4. ホットな文 5.

    ライブラリ 6. 探索と整列 7. データ構造 8. I/O 9. 並行性 10.メモリ管理 そもそもコピーが多い 桁違いに速くなる お金があるから使うのと同じ loop, function 何でも出来る人は要らない アルゴリズムとデータ構造 std::vector,deque,list,map 標準だけでは無理 標準だけでは無理 マジで自作する気?
  16. 最適化技法例

  17. ホットスポットの調べ方 みんなどうやって調べてるの? • プロファイラ • ブロック単位で速度計測 • VSでF10で実行していって遅い箇所 • 適当にBreakして最初に止まった箇所

    ホットな文は10%程度といわれる
  18. If - else if –elseの書き順 最初に if(true)になるなら、if-else ifで書く (switch caseよりも)

    →CPUのコンパイル分岐予測で if(true) を予測する(ものもある)ため ここがホントにボトルネックって、設計を疑った方が…
  19. 右辺値参照の関数戻り値はやめよう RVOの最適化にまかせた方が良い 変にreturnでstd::move書いて、move失敗した ら、copyが走るor落ちるのでマジデ良くない std::vector<int> && test(){ std::vector<int> vec; return

    std::move(vec); } ROV確認は…コンストラクタにログ仕込むか…
  20. 並行処理は標準だけで頑張るな 記述コストが高すぎる…(C++17 parallelに期待?) • Boost.Thread • TBB (計算だけならおススメ) • openBLAS,

    Eigen (高機能な数値計算) C++AMPは…ごめん(ここんとこcuda大人気)
  21. Summary

  22. Summary 最適化プロセス 1. 正しいプログラムを書く 2. 測定する 3. 目標を決める 4. 最適化する

    5. 測定結果を調べる
  23. 次回勉強会 2017/11/29(水)~開始! 数回予定(#^.^#) • C++14の復習 • C++17の予習(言語系, ライブラリ系) https://ebisu-effective-modern-cpp.connpass.com/