ページ 11

<off> MSVC7.1の atof

Posted: 2006年12月13日(水) 02:36
by Justy
 どーでもいい話なんですが。

 Visual C++ (MSVC7.1)付属のライブラリの atofって内部で strlen()がコールされています。

 つまり、んMBものテキストの先頭で atofを何度も何度も使った日には、呼ばれるたびにテキストの終端までチェックするので、結構処理負荷が高くなります。

 実際ずっと前作っていた大容量のテキストを扱っていたアプリで何十万とある浮動小数の読みとり処理に atofが使われていたことがあり、処理に数分かかっていたものがここを改善しただけで2,3秒まで短縮されました。

 元々 atoX系はエラーチェックができないという致命的な欠陥がありますし、すこーし避けたほうがいいのかもしれません。

Re:MSVC7.1の atof

Posted: 2006年12月13日(水) 03:06
by GPGA
atoX系の代わりといえばstrtoX系ですかね、エラーチェックもできますし。
負荷チェックをしたことはないので、処理速度にどのくらいの差があるかはわかりませんが。

atoi限定で言えばDoxygenの翻訳サイトなどをやっている高木信尚さんのブログ内に
自作atoiのプログラムが乗っていました。
http://libc.blog47.fc2.com/blog-entry-74.html

Re:MSVC7.1の atof

Posted: 2006年12月13日(水) 03:32
by Justy
atoX系の代わりといえばstrtoX系ですかね、エラーチェックもできますし。
 困ったことに double版の strtod()も内部で strlenが使われているんです。

 さらなる代替手段となると sscanfくらいだと思うんですが、わざわざ %fとか指定するのも・・・って思います。
 上記の時は結局自作しました。


高木信尚さんのブログ内に
 あ、こちらは巡回 RSSでチェックしてます。
 標準関数の中は結構考えられて作られてるなぁ、としみじみ。

Re:MSVC7.1の atof

Posted: 2006年12月13日(水) 03:32
by Justy
 最近は数値は boost::spiritで処理していたりします。
 一応 spiritは数値が文字列内のどこからどこまでかを正しく判定しているので速いかな、と勝手に妄想しています。
 ちゃんと調べたことはないですが・・・。

Re:MSVC7.1の atof

Posted: 2006年12月13日(水) 11:40
by GPGA
簡単タグ入力がこの掲示板に存在していると今頃気づきました。orz

> 困ったことに double版の strtod()も内部で strlenが使われているんです。
う、それは困りますね。

> 最近は数値は boost::spiritで処理していたりします。
boostですか。
噂を聞いた程度で実際に使用したことは一度もないです。
STLもほとんど使ったことありませんし。

ここ半年ほどJavaをやっている毎日であります。
仕事とは別で、勉強するべきなんでしょうけど
そういう場合は、大抵C#やったりほかのことをやったりするんですよね。
最近仕事がいそがしすぎて、仕事以外のことをやっていないが実際のところですが。

仕事だけの日が続くと、boostやSTLを勉強する日が来るのは、仕事で必要になったとき
以外ありえないという考え方にだんだん変わってきます。