学び方
処理時間減少の参考になりそうな下記3記事を読んで、自分の環境で動かせる箇所は動かしてみる
(1)https://zenn.dev/irugo/articles/4bd113195228c3
(2)https://www.hpcs.cs.tsukuba.ac.jp/~msato/lecture-note/comp2004/note11.html
(3)https://qiita.com/YankeeDeltaBravo225/items/274b92735fbafc060a75
(1)https://zenn.dev/irugo/articles/4bd113195228c3
➀コンパイラ最適化方法
-O0 最適化しない(do no optimization)。デフォルト。
-O1 最小限の最適化をする(minimally)。
-O2 さらに最適化する(more)。
自環境でそれぞれコンパイラオプションで実行したところ下記のような実行し時間となった。
gcc -O0 test_1018.c -o test_1018O0
Elapsed Time: 20.5730000 sec
gcc -O1 test_1018.c -o test_1018O1
Elapsed Time: 18.1040001 sec
gcc -O2 test_1018.c -o test_1018O2
Elapsed Time: 17.5359993 sec
②計算量を減らす
かっこでくくったり、計算方法(早い:加算=減算<乗算<除算:遅い)をリファクタリングできないか確認する
③1次変数の使用
計算結果が同じになる場合は取り出して、いれるなりconstで定義するなりする
(2)https://www.hpcs.cs.tsukuba.ac.jp/~msato/lecture-note/comp2004/note11.html
(1)のページで記載のなかった項目を抜き出す
④ループ展開、ループ融合
ループ展開は下記のようにi++をi+2のようにして、ループ回数を減らす
ループ融合はめんどいので書かないが、複数のfor文を一つにまとめる
⑤デッドコードの削除
(3)https://qiita.com/YankeeDeltaBravo225/items/274b92735fbafc060a75
⑥性能測定ツールを使ってボトルネックを測定する
⑦関数のinline化
関数の呼び出しに負荷や時間がかかるため、マクロ定義をしたり、インライン関数を使ったりする
⑧CPUの仕様書を読み込む
まとめ
聞いたことのある方法もあれば、聞いたことのない方法もあった。
特に大規模開発だと基本ツールをつかって、とりまとめチームがどこが処理負荷が高い出してくれて、指摘されたチームが各ソフトの処理負荷をどう軽減できるか考えながら測定/修正する形になると思う。その中でまずは測定を実施し、ボトルネックを測定できそうであればして、できなさそうであれば、あたりをつけて処理負荷を上記の方法などで改善していくのだろうとなんとなく思った(本来は実装段階で可能な限り高効率な実装を行うのが良いのだろうが。)
コメント