@ -1,22 +1,22 @@ | |||
-module(arrayDs). | |||
-module(utArrayDs). | |||
-compile([nowarn_unused_function, nowarn_unused_vars, nowarn_export_all]). | |||
-export([start/2]). | |||
start(Num, Pid) -> | |||
Ds = init(Num), | |||
erlang:statistics(wall_clock), | |||
Time1 = erlang:system_time(nanosecond), | |||
NewDsI = insert(Num - 1, Ds), | |||
{_, TimeI} = erlang:statistics(wall_clock), | |||
Time2 = erlang:system_time(nanosecond), | |||
NewDsR = read(Num - 1, NewDsI), | |||
{_, TimeR} = erlang:statistics(wall_clock), | |||
Time3 = erlang:system_time(nanosecond), | |||
NewDsU = update(Num - 1, NewDsR), | |||
{_, TimeU} = erlang:statistics(wall_clock), | |||
Time4 = erlang:system_time(nanosecond), | |||
NewDsF = for(Num - 1, NewDsU), | |||
{_, TimeF} = erlang:statistics(wall_clock), | |||
Time5 = erlang:system_time(nanosecond), | |||
delete(Num - 1, NewDsF), | |||
{_, TimeD} = erlang:statistics(wall_clock), | |||
erlang:send(Pid, {over, self(), TimeI, TimeR, TimeU, TimeF, not_support}), | |||
Time6 = erlang:system_time(nanosecond), | |||
erlang:send(Pid, {over, self(), Time2 - Time1, Time3 - Time2, Time4 - Time3, Time5 - Time4, not_support}), | |||
exit(normal). | |||
init(Num) -> |
@ -1,22 +1,22 @@ | |||
-module(gb_setsDs). | |||
-module(utGb_setsDs). | |||
-compile([nowarn_unused_function, nowarn_unused_vars, nowarn_export_all]). | |||
-export([start/2]). | |||
start(Num, Pid) -> | |||
Ds = init(Num), | |||
erlang:statistics(wall_clock), | |||
Time1 = erlang:system_time(nanosecond), | |||
NewDsI = insert(Num, Ds), | |||
{_, TimeI} = erlang:statistics(wall_clock), | |||
Time2 = erlang:system_time(nanosecond), | |||
NewDsR = read(Num, NewDsI), | |||
{_, TimeR} = erlang:statistics(wall_clock), | |||
Time3 = erlang:system_time(nanosecond), | |||
NewDsU = update(Num, NewDsR), | |||
{_, TimeU} = erlang:statistics(wall_clock), | |||
Time4 = erlang:system_time(nanosecond), | |||
NewDsF = for(Num, NewDsU), | |||
{_, TimeF} = erlang:statistics(wall_clock), | |||
Time5 = erlang:system_time(nanosecond), | |||
delete(Num, NewDsF), | |||
{_, TimeD} = erlang:statistics(wall_clock), | |||
erlang:send(Pid, {over, self(), TimeI, TimeR, not_support, TimeF, TimeD}), | |||
Time6 = erlang:system_time(nanosecond), | |||
erlang:send(Pid, {over, self(), Time2 - Time1, Time3 - Time2, not_support, Time5 - Time4, Time6 - Time5}), | |||
exit(normal). | |||
init(_Num) -> |
@ -1,22 +1,22 @@ | |||
-module(gb_treesDs). | |||
-module(utGb_treesDs). | |||
-compile([nowarn_unused_function, nowarn_unused_vars, nowarn_export_all]). | |||
-export([start/2]). | |||
start(Num, Pid) -> | |||
Ds = init(Num), | |||
erlang:statistics(wall_clock), | |||
Time1 = erlang:system_time(nanosecond), | |||
NewDsI = insert(Num, Ds), | |||
{_, TimeI} = erlang:statistics(wall_clock), | |||
Time2 = erlang:system_time(nanosecond), | |||
NewDsR = read(Num, NewDsI), | |||
{_, TimeR} = erlang:statistics(wall_clock), | |||
Time3 = erlang:system_time(nanosecond), | |||
NewDsU = update(Num, NewDsR), | |||
{_, TimeU} = erlang:statistics(wall_clock), | |||
Time4 = erlang:system_time(nanosecond), | |||
NewDsF = for(Num, NewDsU), | |||
{_, TimeF} = erlang:statistics(wall_clock), | |||
Time5 = erlang:system_time(nanosecond), | |||
delete(Num, NewDsF), | |||
{_, TimeD} = erlang:statistics(wall_clock), | |||
erlang:send(Pid, {over, self(), TimeI, TimeR, TimeU, TimeF, TimeD}), | |||
Time6 = erlang:system_time(nanosecond), | |||
erlang:send(Pid, {over, self(), Time2 - Time1, Time3 - Time2, Time4 - Time3, Time5 - Time4, Time6 - Time5}), | |||
exit(normal). | |||
init(_Num) -> |
@ -1,22 +1,25 @@ | |||
-module(listsDs). | |||
-module(utListsDs). | |||
-compile([nowarn_unused_function, nowarn_unused_vars, nowarn_export_all]). | |||
-export([start/2]). | |||
start(Num, Pid) -> | |||
start(Num, Pid) when Num =< 32768 -> | |||
Ds = init(Num), | |||
erlang:statistics(wall_clock), | |||
Time1 = erlang:system_time(nanosecond), | |||
NewDsI = insert(Num, Ds), | |||
{_, TimeI} = erlang:statistics(wall_clock), | |||
NewArrR = read(Num, NewDsI), | |||
{_, TimeR} = erlang:statistics(wall_clock), | |||
NewDsU = update(Num, NewArrR), | |||
{_, TimeU} = erlang:statistics(wall_clock), | |||
Time2 = erlang:system_time(nanosecond), | |||
NewDsR = read(Num, NewDsI), | |||
Time3 = erlang:system_time(nanosecond), | |||
NewDsU = update(Num, NewDsR), | |||
Time4 = erlang:system_time(nanosecond), | |||
NewDsF = for(NewDsU, NewDsU), | |||
{_, TimeF} = erlang:statistics(wall_clock), | |||
Time5 = erlang:system_time(nanosecond), | |||
delete(Num, NewDsF), | |||
{_, TimeD} = erlang:statistics(wall_clock), | |||
erlang:send(Pid, {over, self(), TimeI, TimeR, TimeU, TimeF, TimeD}), | |||
Time6 = erlang:system_time(nanosecond), | |||
erlang:send(Pid, {over, self(), Time2 - Time1, Time3 - Time2, Time4 - Time3, Time5 - Time4, Time6 - Time5}), | |||
exit(normal); | |||
start(Num, Pid) -> | |||
erlang:send(Pid, {over, self(), skip, skip, skip, skip, skip}), | |||
exit(normal). | |||
init(_Num) -> |
@ -1,22 +1,22 @@ | |||
-module(mapsDs). | |||
-module(utMapsDs). | |||
-compile([nowarn_unused_function, nowarn_unused_vars, nowarn_export_all]). | |||
-export([start/2]). | |||
start(Num, Pid) -> | |||
Ds = init(Num), | |||
erlang:statistics(wall_clock), | |||
Time1 = erlang:system_time(nanosecond), | |||
NewDsI = insert(Num, Ds), | |||
{_, TimeI} = erlang:statistics(wall_clock), | |||
Time2 = erlang:system_time(nanosecond), | |||
NewDsR = read(Num, NewDsI), | |||
{_, TimeR} = erlang:statistics(wall_clock), | |||
Time3 = erlang:system_time(nanosecond), | |||
NewDsU = update(Num, NewDsR), | |||
{_, TimeU} = erlang:statistics(wall_clock), | |||
Time4 = erlang:system_time(nanosecond), | |||
NewDsF = for(Num, NewDsU), | |||
{_, TimeF} = erlang:statistics(wall_clock), | |||
Time5 = erlang:system_time(nanosecond), | |||
delete(Num, NewDsF), | |||
{_, TimeD} = erlang:statistics(wall_clock), | |||
erlang:send(Pid, {over, self(), TimeI, TimeR, TimeU, TimeF, TimeD}), | |||
Time6 = erlang:system_time(nanosecond), | |||
erlang:send(Pid, {over, self(), Time2 - Time1, Time3 - Time2, Time4 - Time3, Time5 - Time4, Time6 - Time5}), | |||
exit(normal). | |||
init(_Num) -> |
@ -1,22 +1,25 @@ | |||
-module(orddictDs). | |||
-module(utOrddictDs). | |||
-compile([nowarn_unused_function, nowarn_unused_vars, nowarn_export_all]). | |||
-export([start/2]). | |||
start(Num, Pid) -> | |||
start(Num, Pid) when Num =< 32768 -> | |||
Ds = init(Num), | |||
erlang:statistics(wall_clock), | |||
Time1 = erlang:system_time(nanosecond), | |||
NewDsI = insert(Num, Ds), | |||
{_, TimeI} = erlang:statistics(wall_clock), | |||
Time2 = erlang:system_time(nanosecond), | |||
NewDsR = read(Num, NewDsI), | |||
{_, TimeR} = erlang:statistics(wall_clock), | |||
Time3 = erlang:system_time(nanosecond), | |||
NewDsU = update(Num, NewDsR), | |||
{_, TimeU} = erlang:statistics(wall_clock), | |||
Time4 = erlang:system_time(nanosecond), | |||
NewDsF = for(Num, NewDsU), | |||
{_, TimeF} = erlang:statistics(wall_clock), | |||
Time5 = erlang:system_time(nanosecond), | |||
delete(Num, NewDsF), | |||
{_, TimeD} = erlang:statistics(wall_clock), | |||
erlang:send(Pid, {over, self(), TimeI, TimeR, TimeU, TimeF, TimeD}), | |||
Time6 = erlang:system_time(nanosecond), | |||
erlang:send(Pid, {over, self(), Time2 - Time1, Time3 - Time2, Time4 - Time3, Time5 - Time4, Time6 - Time5}), | |||
exit(normal); | |||
start(Num, Pid) -> | |||
erlang:send(Pid, {over, self(), skip, skip, skip, skip, skip}), | |||
exit(normal). | |||
init(_Num) -> |
@ -1,22 +1,22 @@ | |||
-module(pdDs). | |||
-module(utPdDs). | |||
-compile([nowarn_unused_function, nowarn_unused_vars, nowarn_export_all]). | |||
-export([start/2]). | |||
start(Num, Pid) -> | |||
Ds = init(Num), | |||
erlang:statistics(wall_clock), | |||
Time1 = erlang:system_time(nanosecond), | |||
NewDsI = insert(Num, Ds), | |||
{_, TimeI} = erlang:statistics(wall_clock), | |||
Time2 = erlang:system_time(nanosecond), | |||
NewDsR = read(Num, NewDsI), | |||
{_, TimeR} = erlang:statistics(wall_clock), | |||
Time3 = erlang:system_time(nanosecond), | |||
NewDsU = update(Num, NewDsR), | |||
{_, TimeU} = erlang:statistics(wall_clock), | |||
Time4 = erlang:system_time(nanosecond), | |||
NewDsF = for(Num, NewDsU), | |||
{_, TimeF} = erlang:statistics(wall_clock), | |||
Time5 = erlang:system_time(nanosecond), | |||
delete(Num, NewDsF), | |||
{_, TimeD} = erlang:statistics(wall_clock), | |||
erlang:send(Pid, {over, self(), TimeI, TimeR, TimeU, TimeF, not_support}), | |||
Time6 = erlang:system_time(nanosecond), | |||
erlang:send(Pid, {over, self(), Time2 - Time1, Time3 - Time2, Time4 - Time3, Time5 - Time4, Time6 - Time5}), | |||
exit(normal). | |||
init(Num) -> |
@ -1,22 +1,22 @@ | |||
-module(setsDs). | |||
-module(utSetsDs). | |||
-compile([nowarn_unused_function, nowarn_unused_vars, nowarn_export_all]). | |||
-export([start/2]). | |||
start(Num, Pid) -> | |||
Ds = init(Num), | |||
erlang:statistics(wall_clock), | |||
Time1 = erlang:system_time(nanosecond), | |||
NewDsI = insert(Num, Ds), | |||
{_, TimeI} = erlang:statistics(wall_clock), | |||
Time2 = erlang:system_time(nanosecond), | |||
NewDsR = read(Num, NewDsI), | |||
{_, TimeR} = erlang:statistics(wall_clock), | |||
Time3 = erlang:system_time(nanosecond), | |||
NewDsU = update(Num, NewDsR), | |||
{_, TimeU} = erlang:statistics(wall_clock), | |||
Time4 = erlang:system_time(nanosecond), | |||
NewDsF = for(Num, NewDsU), | |||
{_, TimeF} = erlang:statistics(wall_clock), | |||
Time5 = erlang:system_time(nanosecond), | |||
delete(Num, NewDsF), | |||
{_, TimeD} = erlang:statistics(wall_clock), | |||
erlang:send(Pid, {over, self(), TimeI, TimeR, not_support, TimeF, TimeD}), | |||
Time6 = erlang:system_time(nanosecond), | |||
erlang:send(Pid, {over, self(), Time2 - Time1, Time3 - Time2, not_support, Time5 - Time4, Time6 - Time5}), | |||
exit(normal). | |||
init(_Num) -> |
@ -1,22 +1,25 @@ | |||
-module(tupleDs). | |||
-module(utTupleDs). | |||
-compile([nowarn_unused_function, nowarn_unused_vars, nowarn_export_all]). | |||
-export([start/2]). | |||
start(Num, Pid) -> | |||
start(Num, Pid) when Num =< 65536 -> | |||
Ds = init(Num), | |||
erlang:statistics(wall_clock), | |||
Time1 = erlang:system_time(nanosecond), | |||
NewDsI = insert(Num, Ds), | |||
{_, TimeI} = erlang:statistics(wall_clock), | |||
Time2 = erlang:system_time(nanosecond), | |||
NewDsR = read(Num, NewDsI), | |||
{_, TimeR} = erlang:statistics(wall_clock), | |||
Time3 = erlang:system_time(nanosecond), | |||
NewDsU = update(Num, NewDsR), | |||
{_, TimeU} = erlang:statistics(wall_clock), | |||
Time4 = erlang:system_time(nanosecond), | |||
NewDsF = for(Num, NewDsU), | |||
{_, TimeF} = erlang:statistics(wall_clock), | |||
Time5 = erlang:system_time(nanosecond), | |||
delete(Num, NewDsF), | |||
{_, TimeD} = erlang:statistics(wall_clock), | |||
erlang:send(Pid, {over, self(), TimeI, TimeR, TimeU, TimeF, not_support}), | |||
Time6 = erlang:system_time(nanosecond), | |||
erlang:send(Pid, {over, self(), Time2 - Time1, Time3 - Time2, Time4 - Time3, Time5 - Time4, not_support}), | |||
exit(normal); | |||
start(Num, Pid) -> | |||
erlang:send(Pid, {over, self(), skip, skip, skip, skip, skip}), | |||
exit(normal). | |||
init(Num) -> |
@ -1,35 +0,0 @@ | |||
-module(utTestDS). | |||
-compile([export_all, nowarn_unused_function, nowarn_unused_vars, nowarn_export_all]). | |||
%% 用于测试erlang各种数据结构 读写遍历等操作的效率 | |||
%% lists ,maps 和record是erlang最为常用的数据结构,lists使用方便简单,maps则查询高效,record则需要预定义, | |||
%% 可扩展性差,各有各的优。本文做一下lists和maps的性能对比(再对比一下dict),代码如下(record操作不便则不做比较)。 | |||
%%通过注释部分代码做以下测试 | |||
%%timer:tc(lib_test, test_struct, [10000,#{}]). | |||
%%timer:tc(lib_test, test_struct, [10000,[]]). | |||
test_struct(0, R) -> | |||
Fun = fun({K, V}) -> K + 1, V + 1 end, lists:foreach(Fun, R), %%遍历测试 | |||
Fun = fun(K, V) -> K + 1, V + 1 end, maps:map(Fun, R), | |||
ok; | |||
test_struct(Num, R) -> | |||
NewR = [{Num, Num} | R], lists:keyfind(5000, 1, NewR), %%插入查询测试 | |||
NewR = R#{Num=>Num}, maps:get(5000, NewR, 0), | |||
test_struct(Num - 1, NewR). | |||
%% 做10000次的插入查询测试结果: | |||
%% | |||
%% lists 50736微秒 | |||
%% maps 4670微秒 | |||
%% dict 60236微秒 | |||
%% 做10000次的遍历结果: | |||
%% | |||
%% lists 523微秒 | |||
%% maps 8337微秒 | |||
%% dict 4426微秒 | |||
%% 对比总结: | |||
%% | |||
%% 对比测试数据maps在查询性能上比lists高10倍以上, 而在遍历上lists则更优。对于频繁插入和查询的数据,maps是最佳的选择, | |||
%% lists则适用于广播列表之类需要遍历的数据。除此之外,个人觉得在使用上lists 比maps更为方便,因为lists模块提供了大量实用的函数, | |||
%% 单单在排序上,maps的实用性就不如lists了,所以在数据结构选择上就需要多多斟酌。另外record在查询上使用的是模式匹配,性能只会更高, | |||
%% 但需要提前定义字段,可扩展性差,在热更这块有不少坑,maps也可以用模式匹配查询,但也要确保key值存在,不然就nomatch, | |||
%% 但整体上maps更优于record,故建议用maps替代record。 |