lists モジュール、自前の関数、リスト内包表記の速度比較

検証コード

gist: 6312 ― GitHub

感想

foreach

末尾再帰できなくても自前の関数の方が早い・・・コードの書き方が悪いのかな?
lists:foreach/2 を使ったからといって、可読性が劇的に上がるわけでもないので、lists:foreach/2 は使うの止めよう。

foreach に関しては、lists:foreach、 関数渡し - いたわさににほんしゅ こちらを参考に。

reverse

検証コードを繰り返し実行した所、lists:reverse/1 の方が、自前の関数より早い事の方が多かった。
今後、lists:reverse/1 は積極的に使って行く。

map

関数呼び出しが存在しないなら、リスト内包表記が、速度と可読性のバランスが取れていると思う。
これみたいに関数を使うなら、素直に lists:map/2 を使った方が良い。
ただ、lists:reverse/1 を使っていたとしても、自前の関数の方が lists:map/2 より早い。
個人的には、可読性優先なので、lists:map/2 を使う。
速度を気にするなら、プロセスを分割したり、他のノードに処理を委譲したり、処理内容そのものを変更したりする方が良い気がする。

foldl

こちらも map と同様に、自前の関数の方が早い。
ただ、やはり可読性優先で、lists:foldl/2 を使う。
lists:foldl/2 + lists:reverse/1 vs lists:foldr/2 を後で検証する。

filter

リスト内包表記が一番早く、可読性も高い。
関数を二つ三つ呼んで判定するパターンを後で検証する。

map and filter

filter と同様。