-module(utSTestDs).
|
|
-compile([export_all, nowarn_unused_function, nowarn_unused_vars, nowarn_export_all]).
|
|
-record(tempCnt, {
|
|
insert = []
|
|
, read = []
|
|
, update = []
|
|
, for = []
|
|
, delete = []
|
|
, size = []
|
|
}).
|
|
|
|
%-define(V_NUM, [8, 16, 32, 64, 128, 256, 516, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 524288, 1048576]).
|
|
-define(V_NUM, [8, 16, 32, 64, 128, 256, 516, 1024, 2048, 4096, 8192, 16384]).
|
|
% -define(DsList, [utSPdDs, utSTupleDs, utSListsDs, utSMapsDs, utSQueueDs, utSUtFifoDs, utSUtLifoDs, utSEnlfqDs, utSeLfqDs, utSEtsSetDs, utSEtsOrdDs, utSArrayDs, utSDictDs, utSGb_treesDs, utSSetsDs, utSGb_setsDs, utSOrddictDs, utSOrdsetsDs]).
|
|
-define(DsList, [utSPdDs, utSTupleDs, utSListsDs, utSMapsDs, utSQueueDs, utSArrayDs, utSEtsSetDs, utSEtsOrdDs, utSeLfqDs, utSDictDs, utSGb_treesDs, utSSetsDs, utSGb_setsDs, utSOrddictDs, utSOrdsetsDs]).
|
|
|
|
-define(Cnt, 12).
|
|
|
|
start() ->
|
|
%%erlang:process_flag(trap_exit, true),
|
|
erlang:erase(),
|
|
printLog("Ds benchmark...", []),
|
|
|
|
runDs(?DsList, ?V_NUM),
|
|
printLog("Ds benchmark...Over calculate the AVG~n", []),
|
|
runAvg(?DsList, ?V_NUM).
|
|
|
|
|
|
runDs([Ds | T], VNumList) ->
|
|
printTitle(),
|
|
runNum(VNumList, Ds),
|
|
runDs(T, VNumList);
|
|
runDs([], _VNumList) ->
|
|
ok.
|
|
|
|
runNum([Num | T], Ds) ->
|
|
runCnt(?Cnt, Num, Ds),
|
|
runNum(T, Ds);
|
|
runNum([], _Ds) ->
|
|
ok.
|
|
|
|
runCnt(0, Num, Ds) ->
|
|
ok;
|
|
runCnt(Cnt, Num, Ds) ->
|
|
runExe(Num, Ds),
|
|
runCnt(Cnt - 1, Num, Ds).
|
|
|
|
runExe(Num, Ds) ->
|
|
Pid = erlang:spawn_link(Ds, start, [Num, self()]),
|
|
receive
|
|
{over, Pid, InsertTU, ReadTU, UpdateTU, ForTU, DeleteTU, TermSize} ->
|
|
Insert = cvrTUnit(InsertTU),
|
|
Read = cvrTUnit(ReadTU),
|
|
Update = cvrTUnit(UpdateTU),
|
|
For = cvrTUnit(ForTU),
|
|
Delete = cvrTUnit(DeleteTU),
|
|
storeStatistics(Ds, Num, Insert, Read, Update, For, Delete, TermSize),
|
|
{_, DsName} = lists:split(2, atom_to_list(Ds)),
|
|
printLog("~-10.s ~8.s ~12.s ~12.s ~10.s ~12.s ~10.s ~14.s ~10.s ~12.s ~12.s ~12.s ~12.s ~n",
|
|
[DsName, integer_to_list(Num), timeToStr(Insert), calcPer(Insert, Num), timeToStr(Read), calcPer(Read, Num), timeToStr(Update), calcPer(Update, Num), timeToStr(For), calcPer(For, Num), timeToStr(Delete), calcPer(Delete, Num), sizeToStr(TermSize)]);
|
|
{'EXIT', Pid, normal} ->
|
|
ok;
|
|
_ShutDown ->
|
|
io:format("Ds test shutDown ~p ~p ~p ~n", [Ds, Num, _ShutDown])
|
|
end.
|
|
|
|
runAvg([Ds | T], VNumList) ->
|
|
printAvg(),
|
|
runCal(VNumList, Ds),
|
|
runAvg(T, VNumList);
|
|
runAvg([], _VNumList) ->
|
|
ok.
|
|
|
|
runCal([Num | T], Ds) ->
|
|
#tempCnt{insert = InsertList, read = ReadList, update = UpdateList, for = ForList, delete = DeleteList, size = SizeList} = getStatistics(Ds, Num),
|
|
{_, DsName} = lists:split(2, atom_to_list(Ds)),
|
|
printLog("~-10.s ~8.s ~12.s ~12.s ~14.s ~12.s ~12.s ~12.s~n",
|
|
[DsName, integer_to_list(Num), calcAvgT(InsertList, Num), calcAvgT(ReadList, Num), calcAvgT(UpdateList, Num), calcAvgT(ForList, Num), calcAvgT(DeleteList, Num), calcAvgS(SizeList, Num)]),
|
|
runCal(T, Ds);
|
|
runCal([], _Ds) ->
|
|
ok.
|
|
|
|
-define(S, 1000000000).
|
|
-define(MS, 1000000).
|
|
-define(US, 1000).
|
|
-define(NS, 1).
|
|
|
|
cvrTUnit(not_support) ->
|
|
not_support;
|
|
cvrTUnit(skip) ->
|
|
skip;
|
|
cvrTUnit(Time) ->
|
|
utTc:cvrTimeUnit(Time, native, nanosecond).
|
|
|
|
timeToStr(not_support) ->
|
|
<<"noSupport">>;
|
|
timeToStr(skip) ->
|
|
<<"skip">>;
|
|
timeToStr(Time) when Time > ?S ->
|
|
float_to_list(Time / ?S, [{decimals, 2}]) ++ "s";
|
|
timeToStr(Time) when Time > ?MS ->
|
|
float_to_list(Time / ?MS, [{decimals, 2}]) ++ "ms";
|
|
timeToStr(Time) when Time > ?US ->
|
|
float_to_list(Time / ?US, [{decimals, 2}]) ++ "us";
|
|
timeToStr(Time) ->
|
|
integer_to_list(Time) ++ "ns".
|
|
|
|
sizeToStr(no_size) ->
|
|
<<"noSize">>;
|
|
sizeToStr(TermSize) ->
|
|
integer_to_list(TermSize).
|
|
|
|
calcPer(not_support, _Num) ->
|
|
<<"notSupport">>;
|
|
calcPer(skip, _Num) ->
|
|
<<"skip">>;
|
|
calcPer(Time, Num) ->
|
|
float_to_list(Time / Num, [{decimals, 2}]) ++ "ns".
|
|
|
|
calcAvgS([no_size | _], Num) ->
|
|
<<"noSize">>;
|
|
calcAvgS(CntList, Num) ->
|
|
%% 去掉最大值与最小值 然后求平均值
|
|
AvgCnt = ?Cnt - 2,
|
|
SortList = lists:sort(CntList),
|
|
AvgList = lists:sublist(SortList, 2, AvgCnt),
|
|
integer_to_list(erlang:trunc(lists:sum(AvgList) / AvgCnt)).
|
|
|
|
calcAvgT([not_support | _], Num) ->
|
|
<<"notSupport">>;
|
|
calcAvgT([skip | _], Num) ->
|
|
<<"skip">>;
|
|
calcAvgT(CntList, Num) ->
|
|
%% 去掉最大值与最小值 然后求平均值
|
|
AvgCnt = ?Cnt - 2,
|
|
SortList = lists:sort(CntList),
|
|
AvgList = lists:sublist(SortList, 2, AvgCnt),
|
|
float_to_list(lists:sum(AvgList) / AvgCnt / Num, [{decimals, 2}]) ++ "ns".
|
|
|
|
storeStatistics(Ds, Num, Insert, Read, Update, For, Delete, TermSize) ->
|
|
#tempCnt{insert = InsertList, read = ReadList, update = UpdateList, for = ForList, delete = DeleteList, size = SizeList} =
|
|
case erlang:get({Ds, Num}) of
|
|
undefined ->
|
|
#tempCnt{};
|
|
TempCnt ->
|
|
TempCnt
|
|
end,
|
|
NewTempCnt = #tempCnt{insert = [Insert | InsertList], read = [Read | ReadList], update = [Update | UpdateList], for = [For | ForList], delete = [Delete | DeleteList], size = [TermSize | SizeList]},
|
|
erlang:put({Ds, Num}, NewTempCnt).
|
|
|
|
getStatistics(Ds, Num) ->
|
|
erlang:get({Ds, Num}).
|
|
|
|
printTitle() ->
|
|
printLog("~n~-10.s ~8.s ~12.s ~12.s ~10.s ~12.s ~10.s ~14.s ~10.s ~12.s ~12.s ~12.s ~12.s ~n",
|
|
["DsName", "V_Num", "insert", "insert/per", "read", "read/per", "update", "update/per", "for", "for/per", "delete", "delete/per", "termSize"]),
|
|
printLog("~s ~n", [[$= || _ <- lists:seq(1, 145)]]).
|
|
|
|
printAvg() ->
|
|
printLog("~n~-10.s ~8.s ~12.s ~12.s ~14.s ~12.s ~12.s ~12.s~n",
|
|
["DsName", "V_Num", "insert/per", "read/per", "update/per", "for/per", "delete/per", "termSize"]),
|
|
printLog("~s ~n", [[$= || _ <- lists:seq(1, 85)]]).
|
|
|
|
printLog(Format, Args) ->
|
|
% {ok, File} = file:open("src/docs/erlang-DsBenchMark.txt", [write, append]),
|
|
% io:format(File, Format, Args),
|
|
% file:close(File).
|
|
io:format(Format, Args).
|
|
|
|
|
|
makeK(N) ->
|
|
case N rem 4 of
|
|
0 ->
|
|
N;
|
|
1 ->
|
|
{N, <<"test-testDs">>};
|
|
2 ->
|
|
{N, test};
|
|
3 ->
|
|
[N, test]
|
|
end.
|
|
|
|
makeV(N) ->
|
|
case N rem 4 of
|
|
0 ->
|
|
N;
|
|
1 ->
|
|
{N, <<"test-testDs">>};
|
|
2 ->
|
|
{N, 8787.87878, <<"test-testDs">>};
|
|
3 ->
|
|
{N, test, [list, 123, 456.789, "test"], {23231, "gggggg"}, <<"12345678901234567890">>}
|
|
end.
|
|
|
|
makeV2(N) ->
|
|
case N rem 4 of
|
|
0 ->
|
|
{N, 8787.87878, <<"test-testDs">>};
|
|
1 ->
|
|
{N, test, [list, 123, 456.789, "test"], {23231, "gggggg"}, <<"12345678901234567890">>};
|
|
2 ->
|
|
N;
|
|
3 ->
|
|
{N, <<"test-testDs">>}
|
|
end.
|
|
|
|
makeRandV() ->
|
|
utGenTerm:any().
|
|
|