simple is best だと思う

ネットで色々な人の見解を眺めるのは、なかなか勉強になるのだが、
あまりにも色々とあり過ぎて、時々、混乱する時がある。


例えば、配列とハッシュについて、
自分は直感的にハッシュの方が早いと思っていたのだけれど、
現在のような、大容量のキャッシュを搭載したCPUだと、
連続領域の配列の方が、断片化しているハッシュより早いと。
キャッシュとメモリのアクセス速度が2桁違うと言われると、
確かに、その通りだよなぁ... とか思ってしまう。


でも、なんとなく、引っ掛かる。


キャッシュにヒットするかどうかまで考えて最適化するのもありだとは思う。
だけど、それって、主じゃないと思うんだよね。
例えば、ハッシュの場合、基本的には、一発で該当要素を引き当てる。
そういう用途向けに考えられたデータ構造だと思う。
配列は、基本的なデータ構造の一つだけれど、
やはり、相応しい使いどころってあると思う。
なんでもかんでも、配列にしましょうってのも、
ちょっと、どうなのかな?って思う。


いくら2桁速度が違うからと言っても、
毎回、数百の要素を先頭から走査していくのと、
ハッシュ関数を通して、ほぼ一意の要素を決定するのとでは、
やはり、直感的には、ハッシュの方が分かり易い。
要するに素直な発想だと思う。


まぁ、キャッシュの方が早いんだから、
キャッシュを生かしたアプローチも、
素直と言えば素直なんだろうけど、
キャッシュの存在で、何やら、逆転の発想を迫られているようで...
素直じゃないように思えて仕方が無い。


よ〜く考えてみれば、ハッシュだって、キャッシュに収まっていれば、
本来の特性通り、配列より、ずっと早いはず。
だから、キャッシュサイズが、今より、ずっと大きくなれば、
またまた、アプローチが変わってくるんじゃないかな?
と言うか、本来の姿に戻ると言うかな?


現状のまま、かつ、ピンポイントで、最適化を必要とする場合、
こういうアプローチもありだとは思うけれど、
基本的には、まず、素直に組んでみるってのが、大事な気がする。


つまり、馬鹿の一つ覚え的に、配列にすると早くなるんですよ、
みたいな感じで、無理に配列を使うような組み方ではなくて、
ここは、ギリギリの速度が必要なので、キャッシュにヒットする事を期待して、
敢えて配列にしてみました、くらいが丁度良いかな?と。
言いたい事、分かりますかね?苦笑