Optimized C++ 読書メモ

アバター
a5ua
記事: 199
登録日時: 14年前

Optimized C++ 読書メモ

投稿記事 by a5ua » 8年前

Optimized C++」という本を読んでいます。
まだ読破していませんが、途中で気になったところがあったのでメモを残します。

本記事のプログラムは、著者のHP(http://www.guntheroth.com/)で公開されているものを使用しています。

「4章 文字列使用を最適化する:事例研究」では、
文字列から制御文字を取り除くプログラムを題材に最適化の例を示しています。

ベースとなる(あまり効率の良くない)プログラムは以下の通りです。

CODE:

std::string remove_ctrl(std::string s) {
    std::string result;
    for (size_t i=0; i= 0x20)
            result = result + s[i];
    }
    return result;
}
以下に示すのは修正例の一つで、erase()メンバー関数を使ってアルゴリズムを書き直したものです。

CODE:

std::string remove_ctrl_erase(std::string s) {
    for (size_t i = 0; i ヘッダのstd::remove_if()が思いつきます。
remove_ctrl_erase()はerase()で1文字ずつ削除している点がやや非効率です。

というわけで以下の関数を作りました。
[code=cpp]
std::string remove_ctrl_remove_if(std::string s) {
    s.erase(std::remove_if(s.begin(), s.end(), [](auto ch) { return ch < 0x20; }), s.end());
    return s;
}
性能を測定してみたところ、以下の結果が得られました。

CODE:

remove_ctrl(): 2813 ms
remove_ctrl_erase(): 71 ms
remove_ctrl_remove_if(): 30 ms
remove_ctrl_erase()よりもさらに2倍以上の高速化ができました。(2813/30 = 93.8)

【まとめ】
・書籍に書いてあることが最良であるとは限らない
・実測することは重要

コメントはまだありません。