2008-07-03

FizzBuzzを解くにあたって、他のシーケンスはどうなのか

FizzBuzzを他のシーケンスでも試してみた。まずは、boost::mpl::list だ。結局、要素を端に追加していくだけなのだから、listの方が早いのではないか。そもそも、Loki のシークエンスといえば、list だし。

まず、boost::mpl::list は、コンパイル時の、前方向のみのリンクリストである。push_frontとpop_frontをサポートしている。前回のコードは、push_backを用いていたために、100から1まで減少していくループだったが、今度は逆に、1から100まで増加させるループになる。

単純な変更なので、コードは貼らない。結果は、とても遅かった。vectorとは比べ物にならないほど遅かった。どうやら、C++ Template Metaprogrammingの記述は正しいらしい。vectorに対する利点としては、サイズが限定されていないということだけだ。vectorの実に倍以上のコンパイル時間がかかる。Lokiが書かれた時代のCPUとコンパイラでは、とても遅かったに違いない。Lokiが流行らなかった理由も分かるというものだ。

vectorの固定サイズ限定というのも、typeof拡張のあるコンパイラで消失し、要素の追加もとても高速になるらしい。つまり、C++0xのdecltypeが楽しみだということだ。

では、dequeはどうか。実は、MPLの実装では、dequeとはvectorそのものである。現行のドキュメントを見ると、どうやらvectorもpush_frontなどをサポートしているようだ。ならば話は早い。push_frontを使ったほうが、1から100までインクリメントさせていくループなので、人間的に分かりやすい。

No comments: