Boost」など、さまざまなカンファレンスを企画・運営しています。BOOKS(コードジン・ブックス)は、CodeZineの連載からカットアップした、開発現場の課題解決に役立つ書籍シリーズです。実行画面ソースコードをコンパイルしてプログラムを実行すると、以下のようなコンソール画面に計測結果が表示されます。実行画面これをリダイレクトにてファイルに落とし、そのファイルをExcelに入れてグラフなどに加工して視覚化します。結果を見ると型による違いは特に現れませんでした。それぞれの結果をグラフにすると傾向がよく分かります。int型の計測結果よりもstd::stringの結果の方が、違いが顕著に出ているため分かりやすいです。結果の比較(std::string)std::stringのグラフを見て分かることは、高速なコードはstd::sort()であり、これは型を変えても、項目数を増やしても同じ傾向でした。逆に、低速なコードはstd::multiset<>であり、これはstd::list<>のsort()と同等かそれよりも遅いという結果でした。気になったのは、std::multiset<>やstd::list<>では、項目数が10万件以下の場合、ソート処理時間にかなりのばらつきがあったことです。桁違いに遅い結果が計測されました。この現象については、ソート処理よりも、何らかの原因でデータ構造を再構築することになり、メモリのアロケート処理などで大きく時間をロスしているのではないかと推測します。それにしても、この処理時間がここまでばらつくとは予想外の結果でした。この結果を素直に受け止めるのなら、std::multiset<>やstd::list<>は、データのソートを目的として使うべきではないことになります。筆者は過去にソートを目的としたコードにstd::multiset<>を使ったことがありますが、これについてはなるべく早く訂正すべきであると素直に反省しています。個人的な話になりますが、今回の大きな収穫は「qsort()よりも、std::sort()の方が早い」という計測結果です。「qsort()よりもstd::sort()の方が早いから、無条件にstd::sort()を使え」とか、「std::sort()は比較ルーチンを含みで最適化がかかるからqsort()よりも高速なのだ」という話を聞いていました。これらの話をどこまで信じてよいものか疑問があったのですが、今回の計測結果で、その疑問が晴れました。以下に、ソート処理の部分のみを抜き出してみました。;std::sort()は、一番一般的というか、これが分かりにくいということはないと思われます。;std::multiset<>は、ソートをしているとは認識されないケースが多いと思われます。よって可読性としてはあまりよくないと判断します。;std::list<>は、比較的すっきりと分かりやすい記述になっていると思います。;qsort()はC言語ですし、ポインタを使ったり、比較関数を用意したりと、書くのが面倒です。ソート処理であることは分かるのですが、可読性というか、それ以前にバグが入り込みやすいコードです。C++のSTLが使える環境であれば、わざわざ使う意味はないでしょう。以下に、個人的な感覚で可読性を評価した結果を示します。以下に、個人的な感覚で評価した結果を示します。「C++のSTLにはデータをソートする方法がいくつか存在するが、ソート処理を簡単に、かつ効率のよいコードはどれか...」という疑問の答えは、特別な理由がない限り「ソート処理はstd::sort()を使うべき」という結論になりました。サトシ)フリーでプログラミングの仕事をしたり、本や雑誌の原稿を書いたり、株の売買をしたりして、つつましく暮らしております。NEW1DMM.comの施策から見る、事業をむしばむ「技術負債」への処方箋──リファクタリングの「言語化」でインシデントを予防2企業の7割超が「2025年の崖」を理解していないことが明らかに。NEW1DMM.comの施策から見る、事業をむしばむ「技術負債」への処方箋──リファクタリングの「言語化」でインシデントを予防2企業の7割超が「2025年の崖」を理解していないことが明らかに。NEW1DMM.comの施策から見る、事業をむしばむ「技術負債」への処方箋──リファクタリングの「言語化」でインシデントを予防2企業の7割超が「2025年の崖」を理解していないことが明らかに。12:00法務担当者、6割超が今後業務で「生成AIを使用したい」と回答。新着記事一覧を見るイベント今後の予定を見るCodeZineは、株式会社翔泳社が運営するソフトウェア開発者向けのWebメディアです。「デベロッパーの成長と課題解決に貢献するメディア」をコンセプトに、現場で役立つ最新情報を日々お届けします。イラストの無断転載を禁じます。記載されているロゴ、システム名、製品名は各社及び商標権者の登録商標あるいは商標です。