我一直在寻找Erlang中具有以下特征的数组类型.
append(vector(), term()) O(1)
nth(Idx, vector()) O(1)
set(Idx, vector(), term()) O(1)
insert(Idx, vector(), term()) O(N)
remove(Idx, vector()) O(N)
Run Code Online (Sandbox Code Playgroud)
我通常为此目的使用元组,但性能特征不是我想要的大N.我的测试显示以下性能特征......
erlang:append_element/2 O(N).
erlang:setelement/3 O(N).
Run Code Online (Sandbox Code Playgroud)
我已经开始使用基于clojure.lang.PersistentVector实现的模块,但如果它已经完成,我将不会重新发明轮子.
编辑:
对于那些感兴趣的人,我已经使用与clojure.lang.PersistentVector相同的算法完成了vector.erl的实现.它具有与阵列模块类似的性能特征,但在附加上具有略微更好的常数因子.
以下测试每个间隔附加10000个项目,然后在随机索引处执行10000次查找和10000次更新.所有操作都在O(1)附近.内元组的时间以微秒为单位.
3> seq_perf:test(vector, 100000, 10).
{2685854,
{ok,[{100000,{66966,88437,124376}},
{200000,{66928,76882,125677}},
{300000,{68030,76506,116753}},
{400000,{72429,76852,118263}},
{500000,{66296,84967,119828}},
{600000,{66953,78155,116984}},
{700000,{65996,77815,138046}},
{800000,{67801,78455,118191}},
{900000,{69489,77882,114886}},
{1000000,{67444,80079,118428}}]}}
4> seq_perf:test(array, 100000, 10).
{2948361,
{ok,[{100000,{105482,72841,108828}},
{200000,{123655,78898,124092}},
{300000,{110023,76130,106806}},
{400000,{104126,73830,119640}},
{500000,{104771,72593,110157}},
{600000,{107306,72543,109713}},
{700000,{122066,73340,110662}},
{800000,{105853,72841,110618}},
{900000,{105267,73090,106529}},
{1000000,{103445,73206,109939}}]}}
Run Code Online (Sandbox Code Playgroud) yesod-platform的cabal安装挂起下载xss-sanitize.NetHogs没有显示与此下载相关的网络活动.
$ cabal install yesod-platform
Resolving dependencies...
Downloading xss-sanitize-0.3.4...
Run Code Online (Sandbox Code Playgroud)
其他软件包立即下载并安装.
我在Fedora 18上.haskell平台和cabal-install是最新的回购.
$ cabal --version
cabal-install version 0.14.0
using version 1.14.0 of the Cabal library
$ ghc --version
The Glorious Glasgow Haskell Compilation System, version 7.4.1
Run Code Online (Sandbox Code Playgroud)
我让它一夜之间运行它似乎放弃了xss-sanitizer,并继续安装其他依赖项.这是尾巴.
...
Configuring yesod-test-1.2.1...
Building yesod-test-1.2.1...
Preprocessing library yesod-test-1.2.1...
[1 of 3] Compiling Yesod.Test.CssQuery ( Yesod/Test/CssQuery.hs, dist/build/Yesod/Test/CssQuery.o )
[2 of 3] Compiling Yesod.Test.TransversingCSS ( Yesod/Test/TransversingCSS.hs, dist/build/Yesod/Test/TransversingCSS.o )
[3 of 3] Compiling Yesod.Test ( Yesod/Test.hs, dist/build/Yesod/Test.o )
Yesod/Test.hs:113:1:
Warning: In the use of `runFakeHandler' …Run Code Online (Sandbox Code Playgroud)