@ -1,22 +1,22 @@ | |||||
-module(arrayDs). | |||||
-module(utArrayDs). | |||||
-compile([nowarn_unused_function, nowarn_unused_vars, nowarn_export_all]). | -compile([nowarn_unused_function, nowarn_unused_vars, nowarn_export_all]). | ||||
-export([start/2]). | -export([start/2]). | ||||
start(Num, Pid) -> | start(Num, Pid) -> | ||||
Ds = init(Num), | Ds = init(Num), | ||||
erlang:statistics(wall_clock), | |||||
Time1 = erlang:system_time(nanosecond), | |||||
NewDsI = insert(Num - 1, Ds), | NewDsI = insert(Num - 1, Ds), | ||||
{_, TimeI} = erlang:statistics(wall_clock), | |||||
Time2 = erlang:system_time(nanosecond), | |||||
NewDsR = read(Num - 1, NewDsI), | NewDsR = read(Num - 1, NewDsI), | ||||
{_, TimeR} = erlang:statistics(wall_clock), | |||||
Time3 = erlang:system_time(nanosecond), | |||||
NewDsU = update(Num - 1, NewDsR), | NewDsU = update(Num - 1, NewDsR), | ||||
{_, TimeU} = erlang:statistics(wall_clock), | |||||
Time4 = erlang:system_time(nanosecond), | |||||
NewDsF = for(Num - 1, NewDsU), | NewDsF = for(Num - 1, NewDsU), | ||||
{_, TimeF} = erlang:statistics(wall_clock), | |||||
Time5 = erlang:system_time(nanosecond), | |||||
delete(Num - 1, NewDsF), | 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). | exit(normal). | ||||
init(Num) -> | init(Num) -> |
@ -1,22 +1,22 @@ | |||||
-module(gb_setsDs). | |||||
-module(utGb_setsDs). | |||||
-compile([nowarn_unused_function, nowarn_unused_vars, nowarn_export_all]). | -compile([nowarn_unused_function, nowarn_unused_vars, nowarn_export_all]). | ||||
-export([start/2]). | -export([start/2]). | ||||
start(Num, Pid) -> | start(Num, Pid) -> | ||||
Ds = init(Num), | Ds = init(Num), | ||||
erlang:statistics(wall_clock), | |||||
Time1 = erlang:system_time(nanosecond), | |||||
NewDsI = insert(Num, Ds), | NewDsI = insert(Num, Ds), | ||||
{_, TimeI} = erlang:statistics(wall_clock), | |||||
Time2 = erlang:system_time(nanosecond), | |||||
NewDsR = read(Num, NewDsI), | NewDsR = read(Num, NewDsI), | ||||
{_, TimeR} = erlang:statistics(wall_clock), | |||||
Time3 = erlang:system_time(nanosecond), | |||||
NewDsU = update(Num, NewDsR), | NewDsU = update(Num, NewDsR), | ||||
{_, TimeU} = erlang:statistics(wall_clock), | |||||
Time4 = erlang:system_time(nanosecond), | |||||
NewDsF = for(Num, NewDsU), | NewDsF = for(Num, NewDsU), | ||||
{_, TimeF} = erlang:statistics(wall_clock), | |||||
Time5 = erlang:system_time(nanosecond), | |||||
delete(Num, NewDsF), | 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). | exit(normal). | ||||
init(_Num) -> | init(_Num) -> |
@ -1,22 +1,22 @@ | |||||
-module(gb_treesDs). | |||||
-module(utGb_treesDs). | |||||
-compile([nowarn_unused_function, nowarn_unused_vars, nowarn_export_all]). | -compile([nowarn_unused_function, nowarn_unused_vars, nowarn_export_all]). | ||||
-export([start/2]). | -export([start/2]). | ||||
start(Num, Pid) -> | start(Num, Pid) -> | ||||
Ds = init(Num), | Ds = init(Num), | ||||
erlang:statistics(wall_clock), | |||||
Time1 = erlang:system_time(nanosecond), | |||||
NewDsI = insert(Num, Ds), | NewDsI = insert(Num, Ds), | ||||
{_, TimeI} = erlang:statistics(wall_clock), | |||||
Time2 = erlang:system_time(nanosecond), | |||||
NewDsR = read(Num, NewDsI), | NewDsR = read(Num, NewDsI), | ||||
{_, TimeR} = erlang:statistics(wall_clock), | |||||
Time3 = erlang:system_time(nanosecond), | |||||
NewDsU = update(Num, NewDsR), | NewDsU = update(Num, NewDsR), | ||||
{_, TimeU} = erlang:statistics(wall_clock), | |||||
Time4 = erlang:system_time(nanosecond), | |||||
NewDsF = for(Num, NewDsU), | NewDsF = for(Num, NewDsU), | ||||
{_, TimeF} = erlang:statistics(wall_clock), | |||||
Time5 = erlang:system_time(nanosecond), | |||||
delete(Num, NewDsF), | 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). | exit(normal). | ||||
init(_Num) -> | init(_Num) -> |
@ -1,22 +1,25 @@ | |||||
-module(listsDs). | |||||
-module(utListsDs). | |||||
-compile([nowarn_unused_function, nowarn_unused_vars, nowarn_export_all]). | -compile([nowarn_unused_function, nowarn_unused_vars, nowarn_export_all]). | ||||
-export([start/2]). | -export([start/2]). | ||||
start(Num, Pid) -> | |||||
start(Num, Pid) when Num =< 32768 -> | |||||
Ds = init(Num), | Ds = init(Num), | ||||
erlang:statistics(wall_clock), | |||||
Time1 = erlang:system_time(nanosecond), | |||||
NewDsI = insert(Num, Ds), | 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), | NewDsF = for(NewDsU, NewDsU), | ||||
{_, TimeF} = erlang:statistics(wall_clock), | |||||
Time5 = erlang:system_time(nanosecond), | |||||
delete(Num, NewDsF), | 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). | exit(normal). | ||||
init(_Num) -> | init(_Num) -> |
@ -1,22 +1,22 @@ | |||||
-module(mapsDs). | |||||
-module(utMapsDs). | |||||
-compile([nowarn_unused_function, nowarn_unused_vars, nowarn_export_all]). | -compile([nowarn_unused_function, nowarn_unused_vars, nowarn_export_all]). | ||||
-export([start/2]). | -export([start/2]). | ||||
start(Num, Pid) -> | start(Num, Pid) -> | ||||
Ds = init(Num), | Ds = init(Num), | ||||
erlang:statistics(wall_clock), | |||||
Time1 = erlang:system_time(nanosecond), | |||||
NewDsI = insert(Num, Ds), | NewDsI = insert(Num, Ds), | ||||
{_, TimeI} = erlang:statistics(wall_clock), | |||||
Time2 = erlang:system_time(nanosecond), | |||||
NewDsR = read(Num, NewDsI), | NewDsR = read(Num, NewDsI), | ||||
{_, TimeR} = erlang:statistics(wall_clock), | |||||
Time3 = erlang:system_time(nanosecond), | |||||
NewDsU = update(Num, NewDsR), | NewDsU = update(Num, NewDsR), | ||||
{_, TimeU} = erlang:statistics(wall_clock), | |||||
Time4 = erlang:system_time(nanosecond), | |||||
NewDsF = for(Num, NewDsU), | NewDsF = for(Num, NewDsU), | ||||
{_, TimeF} = erlang:statistics(wall_clock), | |||||
Time5 = erlang:system_time(nanosecond), | |||||
delete(Num, NewDsF), | 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). | exit(normal). | ||||
init(_Num) -> | init(_Num) -> |
@ -1,22 +1,25 @@ | |||||
-module(orddictDs). | |||||
-module(utOrddictDs). | |||||
-compile([nowarn_unused_function, nowarn_unused_vars, nowarn_export_all]). | -compile([nowarn_unused_function, nowarn_unused_vars, nowarn_export_all]). | ||||
-export([start/2]). | -export([start/2]). | ||||
start(Num, Pid) -> | |||||
start(Num, Pid) when Num =< 32768 -> | |||||
Ds = init(Num), | Ds = init(Num), | ||||
erlang:statistics(wall_clock), | |||||
Time1 = erlang:system_time(nanosecond), | |||||
NewDsI = insert(Num, Ds), | NewDsI = insert(Num, Ds), | ||||
{_, TimeI} = erlang:statistics(wall_clock), | |||||
Time2 = erlang:system_time(nanosecond), | |||||
NewDsR = read(Num, NewDsI), | NewDsR = read(Num, NewDsI), | ||||
{_, TimeR} = erlang:statistics(wall_clock), | |||||
Time3 = erlang:system_time(nanosecond), | |||||
NewDsU = update(Num, NewDsR), | NewDsU = update(Num, NewDsR), | ||||
{_, TimeU} = erlang:statistics(wall_clock), | |||||
Time4 = erlang:system_time(nanosecond), | |||||
NewDsF = for(Num, NewDsU), | NewDsF = for(Num, NewDsU), | ||||
{_, TimeF} = erlang:statistics(wall_clock), | |||||
Time5 = erlang:system_time(nanosecond), | |||||
delete(Num, NewDsF), | 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). | exit(normal). | ||||
init(_Num) -> | init(_Num) -> |
@ -1,22 +1,22 @@ | |||||
-module(pdDs). | |||||
-module(utPdDs). | |||||
-compile([nowarn_unused_function, nowarn_unused_vars, nowarn_export_all]). | -compile([nowarn_unused_function, nowarn_unused_vars, nowarn_export_all]). | ||||
-export([start/2]). | -export([start/2]). | ||||
start(Num, Pid) -> | start(Num, Pid) -> | ||||
Ds = init(Num), | Ds = init(Num), | ||||
erlang:statistics(wall_clock), | |||||
Time1 = erlang:system_time(nanosecond), | |||||
NewDsI = insert(Num, Ds), | NewDsI = insert(Num, Ds), | ||||
{_, TimeI} = erlang:statistics(wall_clock), | |||||
Time2 = erlang:system_time(nanosecond), | |||||
NewDsR = read(Num, NewDsI), | NewDsR = read(Num, NewDsI), | ||||
{_, TimeR} = erlang:statistics(wall_clock), | |||||
Time3 = erlang:system_time(nanosecond), | |||||
NewDsU = update(Num, NewDsR), | NewDsU = update(Num, NewDsR), | ||||
{_, TimeU} = erlang:statistics(wall_clock), | |||||
Time4 = erlang:system_time(nanosecond), | |||||
NewDsF = for(Num, NewDsU), | NewDsF = for(Num, NewDsU), | ||||
{_, TimeF} = erlang:statistics(wall_clock), | |||||
Time5 = erlang:system_time(nanosecond), | |||||
delete(Num, NewDsF), | 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). | exit(normal). | ||||
init(Num) -> | init(Num) -> |
@ -1,22 +1,22 @@ | |||||
-module(setsDs). | |||||
-module(utSetsDs). | |||||
-compile([nowarn_unused_function, nowarn_unused_vars, nowarn_export_all]). | -compile([nowarn_unused_function, nowarn_unused_vars, nowarn_export_all]). | ||||
-export([start/2]). | -export([start/2]). | ||||
start(Num, Pid) -> | start(Num, Pid) -> | ||||
Ds = init(Num), | Ds = init(Num), | ||||
erlang:statistics(wall_clock), | |||||
Time1 = erlang:system_time(nanosecond), | |||||
NewDsI = insert(Num, Ds), | NewDsI = insert(Num, Ds), | ||||
{_, TimeI} = erlang:statistics(wall_clock), | |||||
Time2 = erlang:system_time(nanosecond), | |||||
NewDsR = read(Num, NewDsI), | NewDsR = read(Num, NewDsI), | ||||
{_, TimeR} = erlang:statistics(wall_clock), | |||||
Time3 = erlang:system_time(nanosecond), | |||||
NewDsU = update(Num, NewDsR), | NewDsU = update(Num, NewDsR), | ||||
{_, TimeU} = erlang:statistics(wall_clock), | |||||
Time4 = erlang:system_time(nanosecond), | |||||
NewDsF = for(Num, NewDsU), | NewDsF = for(Num, NewDsU), | ||||
{_, TimeF} = erlang:statistics(wall_clock), | |||||
Time5 = erlang:system_time(nanosecond), | |||||
delete(Num, NewDsF), | 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). | exit(normal). | ||||
init(_Num) -> | init(_Num) -> |
@ -1,22 +1,25 @@ | |||||
-module(tupleDs). | |||||
-module(utTupleDs). | |||||
-compile([nowarn_unused_function, nowarn_unused_vars, nowarn_export_all]). | -compile([nowarn_unused_function, nowarn_unused_vars, nowarn_export_all]). | ||||
-export([start/2]). | -export([start/2]). | ||||
start(Num, Pid) -> | |||||
start(Num, Pid) when Num =< 65536 -> | |||||
Ds = init(Num), | Ds = init(Num), | ||||
erlang:statistics(wall_clock), | |||||
Time1 = erlang:system_time(nanosecond), | |||||
NewDsI = insert(Num, Ds), | NewDsI = insert(Num, Ds), | ||||
{_, TimeI} = erlang:statistics(wall_clock), | |||||
Time2 = erlang:system_time(nanosecond), | |||||
NewDsR = read(Num, NewDsI), | NewDsR = read(Num, NewDsI), | ||||
{_, TimeR} = erlang:statistics(wall_clock), | |||||
Time3 = erlang:system_time(nanosecond), | |||||
NewDsU = update(Num, NewDsR), | NewDsU = update(Num, NewDsR), | ||||
{_, TimeU} = erlang:statistics(wall_clock), | |||||
Time4 = erlang:system_time(nanosecond), | |||||
NewDsF = for(Num, NewDsU), | NewDsF = for(Num, NewDsU), | ||||
{_, TimeF} = erlang:statistics(wall_clock), | |||||
Time5 = erlang:system_time(nanosecond), | |||||
delete(Num, NewDsF), | 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). | exit(normal). | ||||
init(Num) -> | 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。 |