关于proplists:get_value/2 与lists:keyfind/2 的效率 早有比较,已出结论,lists:keyfind/2 的效率要好很多,好些人都是直接用或者做过它们之间的比较测试,测试下就一目了然了,直接上代码:

 -module(a).

 -compile(export_all).

  test() ->
Y = "a",
List = [{X,Y} || X<- lists:seq(1,10)],
{Timer1,_} = timer:tc(lists,map,[fun(X) -> proplists:get_value(X,List)end, lists:seq(1,100000)]),
io:format("proplists.......~p~n",[Timer1]),
{Timer2,_} = timer:tc(lists,map,[fun(X) -> lists:keyfind(1,X,List)end, lists:seq(1,100000)]),
io:format("lists.......~p~n",[Timer2]),
ok.

结果很清楚,分别执行10万次,time分别为60000和10000微秒,而且调用次数越多,差异越明显。很明显lists:keyfind/2 的效率要好很多。

附个老外较早之前测试的链接:http://www.ostinelli.net/erlang-listskeyfind-or-proplistsget_value

比较下这两个的具体实现:

看下源码:

-spec get_value(Key, List, Default) -> term() when
Key :: term(),
List :: [term()],
Default :: term(). get_value(Key, [P | Ps], Default) ->
if is_atom(P), P =:= Key ->
true;
tuple_size(P) >= 1, element(1, P) =:= Key ->
case P of
{_, Value} ->
Value;
_ ->
%% Don</code>t continue the search!
Default
end;
true ->
get_value(Key, Ps, Default)
end;
get_value(_Key, [], Default) ->
Default.
%% Shadowed by erl_bif_types: lists:keyfind/3
-spec keyfind(Key, N, TupleList) -> Tuple | false when
Key :: term(),
N :: pos_integer(),
TupleList :: [Tuple],
Tuple :: tuple(). keyfind(_, _, _) ->
erlang:nif_error(undef).

很明显:可以看到,proplists:get_value/2 是遍历递归实现的,而lists:keyfind/3是调用nif接口实现的。

关于proplists:get_value/2 与lists:keyfind/3 的效率比较的更多相关文章

  1. erlang lists模块函数使用大全

    转自:http://qqdenghaigui.iteye.com/blog/1554541 一,带函数Pred1, all(Pred, List) -> boolean()如果List中的每个元 ...

  2. erlang lists

    http://blog.csdn.net/dp0304/article/details/7590233 一,带函数Pred1, all(Pred, List) -> boolean()如果Lis ...

  3. Erlang--proplists结构解析

    proplists 模块适用数据量较少的场景,处理配置文件和函数选项时常用.proplists对内部数据结构是Key-Value键值对形式,第一个元素做key用来查询和删除,如果一个key有多个值就会 ...

  4. cowboy源码分析(二)

    接 cowboy源码分析(一) 下面我们重点看看cowboy_protocol.erl代码 -module(cowboy_protocol). %% API. -export([start_link/ ...

  5. ranch 源码分析(一)

    以前写了一个ranch的处理流程,http://www.cnblogs.com/tudou008/p/5197314.html ,就只有一张图,不是很清晰,现在有空做个源码分析. ranch的源码(版 ...

  6. ranch 源码分析(二)

    接上ranch 源码分析(一) 上次讲到了ranch.erl的start_listener函数,下面我们详细分析下这个函数 -module(ranch). %...... 省略若干行 -spec st ...

  7. ranch源码阅读

    ranch 整体理解 从整体上的话,ranch主要是三层的监控树 第一层 ranch_sup,负责整个应用的启动,启动了ranch_server进程,它管理了整个应用的配置和连接数据 第二层 ranc ...

  8. erlang 在线生成crashdump

    一般说来抓dump 4种 方式:      1. erlang:halt(“abort”).      2. 在erlang shell下输入CTRL C + “大写的A”      3.等着进程崩溃 ...

  9. 一次erlang 节点CPU严重波动排查

    新服务上线后观察到,CPU在10 ~ 70%间波动严重,但从每秒业务计数器看业务处理速度很平均. 接下来是排查步骤: 1. dstat -tam 大概每10s一个周期,网络流量开始变得很小,随后突然增 ...

随机推荐

  1. JavaScript效果下载网站!

    原文发布时间为:2009-07-16 -- 来源于本人的百度文章 [由搬家工具导入] http://myjs.chinaz.com/

  2. Android使用圆角

    圆角Button 效果图 绿色Button 定义button_green.xml资源文件位于drawable文件夹下,可用作button的background属性 button_green.xml: ...

  3. LVS高可用集群的配置

    网络结构: LVS DR工作原理 LVS集群从客户端上看可以将整个集群看成单个服务器对外提供服务,其IP是集群内部的VIP(虚拟IP).从内部看,转发服务器(DS)其实并没有启动应用层的服务对接口进行 ...

  4. hdu 3074(线段树)

    Multiply game Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

  5. hdu 1452(因子和+逆元)

    Happy 2004 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  6. AC日记——黑魔法师之门 codevs 1995

    1995 黑魔法师之门  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Description 经过了16个工作日的紧张 ...

  7. ios获得文件字节总数

    NSDictionary *attributes = [[NSFileManager defaultManager] attributesOfItemAtPath:self.finalPath err ...

  8. MD5 algorithm in Objective C

    How to calculate the MD5 in objective C ? md5 is available on the iPhone and can be added as an exte ...

  9. Fresco的使用及注意事项

    Fresco的使用及注意事项 时间 2016-10-17 18:32:12 DevWiki's Blog 原文  http://blog.devwiki.net/index.php/2016/10/1 ...

  10. python selenium中调用js

    python 中js中单引号和双引号混合编程 js = 'document.getElementsByName("m:ybzbxmbd:b_BIANHAO")[0].setAttr ...