<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Proplists on cnDenis的笔记</title><link>https://blog.cndenis.com/tags/proplists.html</link><description>Recent content in Proplists on cnDenis的笔记</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Fri, 30 May 2014 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.cndenis.com/tags/proplists/index.xml" rel="self" type="application/rss+xml"/><item><title>【Erl代码片段】更快的proplists:get_value/3</title><link>https://blog.cndenis.com/Erlang/2014/05/faster_proplists_get_value.html</link><pubDate>Fri, 30 May 2014 00:00:00 +0000</pubDate><guid>https://blog.cndenis.com/Erlang/2014/05/faster_proplists_get_value.html</guid><description>&lt;p&gt;在cowboy的&lt;a class="link" href="https://github.com/extend/cowboy/blob/master/src/cowboy_protocol.erl" target="_blank" rel="noopener"
 &gt;cowboy_protocol.erl&lt;/a&gt;
文件中看到如这样一下函数:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-erlang" data-lang="erlang"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;%% Faster alternative to proplists:get_value/3.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;get_value&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;Key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;Opts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;Default&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nn"&gt;lists&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;keyfind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;Key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;Opts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{_,&lt;/span&gt; &lt;span class="nv"&gt;Value&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;Value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;_&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;Default&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;做了一下测试, 考虑到proplist一般都不长, 用一个10个元素的列表进行测试,
结果这个函数比 &lt;code&gt;proplists:get_value/3&lt;/code&gt; 快5倍, 对于更长的列表差别更大.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;bench:get_value/3
Single Process: 13035909 call per sec, 16777216 times in 1287 ms

proplists:get_value/3
Single Process: 2273335 call per sec, 4194304 times in 1845 ms
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;速度差别原因主要是, &lt;code&gt;keyfind&lt;/code&gt; 是BIF, 用C实现的,
而 &lt;code&gt;proplists:get_value/3&lt;/code&gt; 是erlang实现的,
另外 &lt;code&gt;proplists:get_value/3&lt;/code&gt; 把 atom 当作 {atom, true} 处理,
逻辑比 &lt;code&gt;keyfind&lt;/code&gt; 复杂一些&lt;/p&gt;
&lt;p&gt;这里另外一个测试和讨论:
&lt;a class="link" href="http://www.ostinelli.net/erlang-listskeyfind-or-proplistsget_value/" target="_blank" rel="noopener"
 &gt;http://www.ostinelli.net/erlang-listskeyfind-or-proplistsget_value/&lt;/a&gt;,&lt;/p&gt;</description></item></channel></rss>