C++で数値を文字列に変換する方法は、sprintf, iostreamのstd::stringstream, boost::lexical_cast, boost::formatなどが有名ですが、最も実行速度の速い方法は他にあり、Boost.Spirit.Karmaを使用する方法です。
Boost.Spirit.Karmaの初歩的な使用方法は以下のソースコードを参考にしてください。
(https://gist.github.com/muumu/d8e399c544076301e94d)
また、boost公式のパフォーマンス計測が自分にとって不十分だったので、下記の改変したソースコードでパフォーマンス計測を実行しました。
(https://gist.github.com/muumu/3b1801456481b447f3a2)
ltoaは自分の環境に無いためコメントアウト、代わりにsnprintfを追加。(snprintfは、sprintfより安全で、同程度か僅かに速い関数です。)
パフォーマンス計測結果
前回、小数のフォーマット出力が最も高速なのがBoost.Spirit.Karmaであることを紹介したので、今回は整数値の計測を示します。
処理内容は、ランダム値を表示するものです。
(実行環境: boost: 1.54.0, gcc: 4.8.2 コンパイルオプション: -O3, -std=c++1y, CPU: Core i3 4130T)
Converting 10000000 randomly generated int values to strings. snprintf (std::string): 1.06302 [s] snprintf (char[]): 0.834953 [s] iostreams (std::string): 1.23543 [s] iostreams (std::stringstream): 0.673501 [s] Boost.Format (std::string): 4.26696 [s] boost::lexical_cast (std::string): 0.806607 [s] Karma int_ (std::string): 0.326372 [s] Karma int_ (char[]): 0.131378 [s] Karma (std::string): 0.254512 [s] // 直接std::stringに出力するkarma // ()内は出力形式。 // char配列型で()内がstd::stringなものは、出力結果を改めてstd::string型に代入してます
Karmaはsnprintfの実に5倍前後高速な結果となりました。 Boost.Spirit.Karmaが何故こんなに高速なのか、興味が出たので今後調査したいと思っています。
0 件のコメント:
コメントを投稿