Japan MVP Community Connection 2017 Autumn Optimized C++! 最適化の手法集めました 遥佐保 PPTX→http://jyurimaru.info/data/20171112MVPCommunityConnection_OptimizedCpp/20171112_Optimized_cpp_public.pptx
Optimized C++!最適化の手法集めましたHaruka SaoMicrosoft MVP for Windows DevelopmentJapan MVP Community Connection 2017 Autumn2017/11/12 Sun
View Slide
@hr_saoMicrosoft MVP for Windows Development [2010-2017]ebisu_optimized.cpp2017/3/31-11/9
今年2017年2月最適化だけを考えた書籍が日本語で出版!ディスカッション会を隔週で開催で、実際、この内容どうよ?話を参加者と共有
最適化について考える機会とにかく実行速度を早くしてくれと言われたなんとなく処理に時間がかかってる気がするそもそも最適化するのが好き(?)
Agenda• プログラムを書き始める前に知るべきこと• 最適化をする直前に考えること• 最適化を実施する時のこと• 最適化技法例
プログラムを書き始める前に知るべきこと
速いプログラムは正しいってこと色んな意見がありますが「結果的に高速に動くプログラムが良い」に決まってる→低性能はバグと同じただし…
してはいけない事や間違った思い込み1アセンブラやC言語で書き直す• C++の方が速い• 手書きには限界がある
してはいけない事や間違った思い込み2良くないアルゴリズムを最適化する• 最初から良いアルゴリズム/ライブラリを採用しよう• もう既に先駆者がいてます• 後から最適化する→例えば構造化の最適化などは後から無理
してはいけない事や間違った思い込み3ホットじゃない箇所を必死に最適化する雰囲気でボトルネックを探す• 実験、計測が全て• 直感だけで最適化に時間をかけないこと
最適化をする直前に考えること
最適化しないといけないなと思った時…計測することだけが最適化の効果があり!を証明できる• 計測する、コストを見積もる• どこが、どこまで速くなればいいのか決める• 最適化の前後で計測する
最適化を実施する時のこと
C++で最適化出来る箇所1. 文字列2. アルゴリズム3. 動的変数割り当て4. ホットな文5. ライブラリ6. 探索と整列7. データ構造8. I/O9. 並行性10.メモリ管理計測後に、取り組む順番も大事…
C++で最適化出来る箇所1. 文字列2. アルゴリズム3. 動的変数割り当て4. ホットな文5. ライブラリ6. 探索と整列7. データ構造8. I/O9. 並行性10.メモリ管理そもそもコピーが多い桁違いに速くなるお金があるから使うのと同じloop, function何でも出来る人は要らないアルゴリズムとデータ構造std::vector,deque,list,map標準だけでは無理標準だけでは無理マジで自作する気?
最適化技法例
ホットスポットの調べ方みんなどうやって調べてるの?• プロファイラ• ブロック単位で速度計測• VSでF10で実行していって遅い箇所• 適当にBreakして最初に止まった箇所ホットな文は10%程度といわれる
If - else if –elseの書き順最初に if(true)になるなら、if-else ifで書く(switch caseよりも)→CPUのコンパイル分岐予測でif(true) を予測する(ものもある)ためここがホントにボトルネックって、設計を疑った方が…
右辺値参照の関数戻り値はやめようRVOの最適化にまかせた方が良い変にreturnでstd::move書いて、move失敗したら、copyが走るor落ちるのでマジデ良くないstd::vector && test(){std::vector vec;return std::move(vec);}ROV確認は…コンストラクタにログ仕込むか…
並行処理は標準だけで頑張るな記述コストが高すぎる…(C++17 parallelに期待?)• Boost.Thread• TBB (計算だけならおススメ)• openBLAS, Eigen (高機能な数値計算)C++AMPは…ごめん(ここんとこcuda大人気)
Summary
Summary最適化プロセス1. 正しいプログラムを書く2. 測定する3. 目標を決める4. 最適化する5. 測定結果を調べる
次回勉強会2017/11/29(水)~開始!数回予定(#^.^#)• C++14の復習• C++17の予習(言語系, ライブラリ系)https://ebisu-effective-modern-cpp.connpass.com/