$30 off During Our Annual Pro Sale. View Details »

2017/11/12 Optimized C++!

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

Akiko Kawai

November 12, 2017
Tweet

More Decks by Akiko Kawai

Other Decks in Technology

Transcript

  1. Optimized C++!
    最適化の手法集めました
    Haruka Sao
    Microsoft MVP for Windows Development
    Japan MVP Community Connection 2017 Autumn
    2017/11/12 Sun

    View Slide

  2. @hr_sao
    Microsoft MVP for Windows Development [2010-2017]
    ebisu_optimized.cpp
    2017/3/31-11/9

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  15. C++で最適化出来る箇所
    1. 文字列
    2. アルゴリズム
    3. 動的変数割り当て
    4. ホットな文
    5. ライブラリ
    6. 探索と整列
    7. データ構造
    8. I/O
    9. 並行性
    10.メモリ管理
    そもそもコピーが多い
    桁違いに速くなる
    お金があるから使うのと同じ
    loop, function
    何でも出来る人は要らない
    アルゴリズムとデータ構造
    std::vector,deque,list,map
    標準だけでは無理
    標準だけでは無理
    マジで自作する気?

    View Slide

  16. 最適化技法例

    View Slide

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

    View Slide

  18. If - else if –elseの書き順
    最初に if(true)になるなら、if-else ifで書く
    (switch caseよりも)
    →CPUのコンパイル分岐予測で
    if(true) を予測する(ものもある)ため
    ここがホントにボトルネックって、設計を疑った方が…

    View Slide

  19. 右辺値参照の関数戻り値はやめよう
    RVOの最適化にまかせた方が良い
    変にreturnでstd::move書いて、move失敗した
    ら、copyが走るor落ちるのでマジデ良くない
    std::vector && test(){
    std::vector vec;
    return std::move(vec);
    }
    ROV確認は…コンストラクタにログ仕込むか…

    View Slide

  20. 並行処理は標準だけで頑張るな
    記述コストが高すぎる…(C++17 parallelに期待?)
    • Boost.Thread
    • TBB (計算だけならおススメ)
    • openBLAS, Eigen (高機能な数値計算)
    C++AMPは…ごめん(ここんとこcuda大人気)

    View Slide

  21. Summary

    View Slide

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

    View Slide

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

    View Slide