リスト内のタプルのキーが重複する場合の lists:filter/2 と list:keysearch/3 の速度比較
yaws で遊んでいたのですが、GET で a=b&a=c みたいな引数を渡すと
yaws_api:parse_query(Arg)
を実行した際の戻り値が
[{"a","b"}, {"a","c"}]
となるので、リスト内のタプルのキーが重複する場合は、どうやったら素早くタプルを取り出せるのかなぁと思い、2 パターンだけベンチマークを取ってみた。
下記のようなテスト用のモジュールを作り・・・
-module(test). -author('cooldaemon@gmail.com'). -export([keysearch/0, filter/0]). make_list() -> lists:merge( [{a, X} || X <- lists:seq(1, 100000)], [{b, X} || X <- lists:seq(1, 10)] ). keysearch() -> search_loop(make_list(), []). search_loop(TargetList, ResultList) -> case lists:keysearch(b, 1, TargetList) of false -> ResultList; Element -> search_loop(lists:keydelete(b, 1, TargetList), [Element | ResultList]) end. filter() -> lists:filter(fun ({b, _}) -> true; (_) -> false end, make_list()).
id:cooldaemon:20071101 で作った bench:mark/1 を使って計測。
1> bench:mark(fun test:filter/0). 70 (123) msec ok 2> bench:mark(fun test:keysearch/0). 150 (277) msec ok
対象のリストを生成する時間も含まれていますが・・・、気にしない方向で。
list:filter/2 より速度が早い方法、何かあるかなー?