パフォーマンスを気にしているならlexical_castを使わない方がいい

tkngさんの日記「C++で例外を使ったプログラムをうまく書くにはどうすればいいのか」を読んで、
パフォーマンスを気にするのであれば「文字列=>整数変換」にboost::lexical_castを使わない方がいいんじゃないかと思ったのでその実験結果メモ。


C++では文字列整数変換を行う時に3種類ぐらいの方法がある。
(もちろん自分でstrtol相当を書くこともできるし、みんな一度は自分で実装してそうだけど・・・)

  1. strtolを使う方法
  2. stringstreamを使う方法
  3. boost::lexical_castを使う方法


そもそもboost::lexical_castを使う場合は、中でstringstreamを使ってるというを聞いたことがあって、
オブジェクトのコピー等が頻発して非常に遅い思っていた。
なので、どのぐらい遅いのか、ということを実際にベンチマークを取って計測してみた。


実験に使ったプログラムは二種類。

  1. テストデータを出力するプログラム
  2. 上記3種類の方法のベンチーマークプログラム


実行結果 (g++ バージョン: 4.4.3 コンパイルオプション: g++ -O2 -DNODEBUG strtol_bench.cc -o strtol_bench)

strtolを使った方法 0.06秒
stringstreamを使った方法 0.67秒
boost::lexical_castを使った方法 0.42秒


ということで、strtolを使った方法では約5 〜 8倍boost::lexical_castよりも速い。


strtolを使った方法では、エラー処理等をいれてないからじゃないか?という批判があるかもしれないので、
一応プログラムの方ではエラー処理を入れて計測している。
stringstreamよりboost::lexical_castの方が高速なのは、boostならではのチューニングがされているということなんだと思う。


C++でもパフォーマンスが問題とする時と、問題としない時(LLを使っても良いが、ライブラリの関係でC++で書いた方が早いという時)があると思っていて、
パフォーマンスが気にならない場合は、boost::lexical_castを使って富豪的に書いちゃってもいいんじゃないかなーと思う。


でもライブラリ書くならパフォーマンス、わかりやすさ、どちらも取るべきだと思うので、そういった場合にboost::lexical_castは適さない、というのが結論。


あ、でも↑のは例題の解答なので、質問の本題には答えられていません。
本題の方は、プログラム例の方で書いていますが、こういった場合僕ならstrtol+(char_numを格納できる)新しい例外クラスを作ってそれを投げます。

また、もしバイナリでシリアライズが可能であればバイナリでシリアライズした方が高速なのでそちらをおすすめします。

MacBook Air 11インチ欲しい!

wgetオプション

あーっと、これだけ書き忘れてた。自分用にメモ。
サイトのあるディレクトリを丸ごとミラーしたい場合。

wget -m -E -k -w 10 -np
-m はミラーリングオプションです。
-E はhtmlがついていないCGIなどの場合に、自動的にhtmlを付与します。
http://d.hatena.ne.jp/higashiya/20070719 => http://d.hatena.ne.jp/higashiya/20070719.html
みたいに。
-k はリンクの絶対パス相対パスに変更します。
-w 10 は10秒間待ちます。2ぐらいが普通なのかな?
-np は親ディレクトリを辿りません。
以上です。

blog移転

てことでそろそろ誰もみていないと思いますがblogを移転します。
こちらです。
単純に…使いやすさの問題です。アクセス解析が有料なの(モチベーション維持に…)と一行一pタグで囲むのがうーんなんだかなぁと。
キーワードの自動リンクもあまり好きじゃなかったので切っていましたし。

wikipediaの静的HTML

いつの間にか静的HTMLがダウンロードできるようになったみたいです。
http://static.wikipedia.org/
HDDに入れておくと何かと便利かもしれない。4〜5GBありますが。
俺は自宅サーバーに展開しておきました。外部にはライセンスの関係もあり制限かけていますが。

震えるほどビート

puttyには関係ない話ですがOpenSSHクライアントで放っておくとすぐに接続が切れる問題。
詳しくはこちら
Hartbeatパッチなんてありますが、現在Mac OSXなんかに入っているバージョンなら


ServerAliveInterval 120
と.ssh_configとかに記述すればOKっぽいです。
古い情報とかいろいろ入り交じっていて、こういう時かなり厄介だよなぁ…。
あ、ちなみに古いバージョンのOpenSSHを浸かってる方はアップデートしといた方がいいです…。
つい最近といっても一年位前?OpenBSDプロジェクトには珍しい大きなセキュリティホールあったらしいので…。

各種リファレンス置き場

いあ、検索すればすぐ見つかるとも思いますが。とりあえずHDDに入れとくと便利かも。

python
日本語 2.4
英語 2.5


php


ruby


java6


gauche


emacs lisp
英語 ver.2.9
日本語 ver.2.5



emacs lisp for beginner
英語 2.05
日本語 2.04


emacs manual
英語 22.1対応
日本語 ?


javascript
MDC
http://devedge-temp.mozilla.org/central/javascript/index_en.html
これが一番見つけにくい?


C++
C++ Annotation
若干微妙ですが…。

ルーター死亡?

ルーターが死亡した模様?
家では最近256kbps程度しか出なくて、ADSL50Mプランにしてるはずなのにおかしいなと思っていたら、ルーターがおかしくなっていた模様。無線LANも最近上手く使えないことが多いし、そろそろ寿命かのぅ・・・。


まぁ、就職してボーナスが出て、余裕があったらまた買うべプランに直行。(二年後ぐらい?)


うーん、内容薄すぎ。また後で身のある内容を追記します。