リスト内のタプルのキーが重複する場合の 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 より速度が早い方法、何かあるかなー?