erlang各种有用的函数包括一些有用nif封装,还有一些性能测试case。
25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

209 lines
6.6 KiB

4 년 전
4 년 전
3 년 전
4 년 전
4 년 전
4 년 전
4 년 전
4 년 전
4 년 전
4 년 전
4 년 전
4 년 전
4 년 전
4 년 전
4 년 전
4 년 전
4 년 전
  1. -module(utSTestDs).
  2. -compile([export_all, nowarn_unused_function, nowarn_unused_vars, nowarn_export_all]).
  3. -record(tempCnt, {
  4. insert = []
  5. , read = []
  6. , update = []
  7. , for = []
  8. , delete = []
  9. , size = []
  10. }).
  11. %-define(V_NUM, [8, 16, 32, 64, 128, 256, 516, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 524288, 1048576]).
  12. -define(V_NUM, [8, 16, 32, 64, 128, 256, 516, 1024, 2048, 4096, 8192, 16384]).
  13. % -define(DsList, [utSPdDs, utSTupleDs, utSListsDs, utSMapsDs, utSQueueDs, utSUtFifoDs, utSUtLifoDs, utSEnlfqDs, utSeLfqDs, utSEtsSetDs, utSEtsOrdDs, utSArrayDs, utSDictDs, utSGb_treesDs, utSSetsDs, utSGb_setsDs, utSOrddictDs, utSOrdsetsDs]).
  14. -define(DsList, [utSPdDs, utSTupleDs, utSListsDs, utSMapsDs, utSQueueDs, utSArrayDs, utSEtsSetDs, utSEtsOrdDs, utSeLfqDs, utSDictDs, utSGb_treesDs, utSSetsDs, utSGb_setsDs, utSOrddictDs, utSOrdsetsDs]).
  15. -define(Cnt, 12).
  16. start() ->
  17. %%erlang:process_flag(trap_exit, true),
  18. erlang:erase(),
  19. printLog("Ds benchmark...", []),
  20. runDs(?DsList, ?V_NUM),
  21. printLog("Ds benchmark...Over calculate the AVG~n", []),
  22. runAvg(?DsList, ?V_NUM).
  23. runDs([Ds | T], VNumList) ->
  24. printTitle(),
  25. runNum(VNumList, Ds),
  26. runDs(T, VNumList);
  27. runDs([], _VNumList) ->
  28. ok.
  29. runNum([Num | T], Ds) ->
  30. runCnt(?Cnt, Num, Ds),
  31. runNum(T, Ds);
  32. runNum([], _Ds) ->
  33. ok.
  34. runCnt(0, Num, Ds) ->
  35. ok;
  36. runCnt(Cnt, Num, Ds) ->
  37. runExe(Num, Ds),
  38. runCnt(Cnt - 1, Num, Ds).
  39. runExe(Num, Ds) ->
  40. Pid = erlang:spawn_link(Ds, start, [Num, self()]),
  41. receive
  42. {over, Pid, InsertTU, ReadTU, UpdateTU, ForTU, DeleteTU, TermSize} ->
  43. Insert = cvrTUnit(InsertTU),
  44. Read = cvrTUnit(ReadTU),
  45. Update = cvrTUnit(UpdateTU),
  46. For = cvrTUnit(ForTU),
  47. Delete = cvrTUnit(DeleteTU),
  48. storeStatistics(Ds, Num, Insert, Read, Update, For, Delete, TermSize),
  49. {_, DsName} = lists:split(2, atom_to_list(Ds)),
  50. 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",
  51. [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)]);
  52. {'EXIT', Pid, normal} ->
  53. ok;
  54. _ShutDown ->
  55. io:format("Ds test shutDown ~p ~p ~p ~n", [Ds, Num, _ShutDown])
  56. end.
  57. runAvg([Ds | T], VNumList) ->
  58. printAvg(),
  59. runCal(VNumList, Ds),
  60. runAvg(T, VNumList);
  61. runAvg([], _VNumList) ->
  62. ok.
  63. runCal([Num | T], Ds) ->
  64. #tempCnt{insert = InsertList, read = ReadList, update = UpdateList, for = ForList, delete = DeleteList, size = SizeList} = getStatistics(Ds, Num),
  65. {_, DsName} = lists:split(2, atom_to_list(Ds)),
  66. printLog("~-10.s ~8.s ~12.s ~12.s ~14.s ~12.s ~12.s ~12.s~n",
  67. [DsName, integer_to_list(Num), calcAvgT(InsertList, Num), calcAvgT(ReadList, Num), calcAvgT(UpdateList, Num), calcAvgT(ForList, Num), calcAvgT(DeleteList, Num), calcAvgS(SizeList, Num)]),
  68. runCal(T, Ds);
  69. runCal([], _Ds) ->
  70. ok.
  71. -define(S, 1000000000).
  72. -define(MS, 1000000).
  73. -define(US, 1000).
  74. -define(NS, 1).
  75. cvrTUnit(not_support) ->
  76. not_support;
  77. cvrTUnit(skip) ->
  78. skip;
  79. cvrTUnit(Time) ->
  80. utTc:cvrTimeUnit(Time, native, nanosecond).
  81. timeToStr(not_support) ->
  82. <<"noSupport">>;
  83. timeToStr(skip) ->
  84. <<"skip">>;
  85. timeToStr(Time) when Time > ?S ->
  86. float_to_list(Time / ?S, [{decimals, 2}]) ++ "s";
  87. timeToStr(Time) when Time > ?MS ->
  88. float_to_list(Time / ?MS, [{decimals, 2}]) ++ "ms";
  89. timeToStr(Time) when Time > ?US ->
  90. float_to_list(Time / ?US, [{decimals, 2}]) ++ "us";
  91. timeToStr(Time) ->
  92. integer_to_list(Time) ++ "ns".
  93. sizeToStr(no_size) ->
  94. <<"noSize">>;
  95. sizeToStr(TermSize) ->
  96. integer_to_list(TermSize).
  97. calcPer(not_support, _Num) ->
  98. <<"notSupport">>;
  99. calcPer(skip, _Num) ->
  100. <<"skip">>;
  101. calcPer(Time, Num) ->
  102. float_to_list(Time / Num, [{decimals, 2}]) ++ "ns".
  103. calcAvgS([no_size | _], Num) ->
  104. <<"noSize">>;
  105. calcAvgS(CntList, Num) ->
  106. %% 去掉最大值与最小值 然后求平均值
  107. AvgCnt = ?Cnt - 2,
  108. SortList = lists:sort(CntList),
  109. AvgList = lists:sublist(SortList, 2, AvgCnt),
  110. integer_to_list(erlang:trunc(lists:sum(AvgList) / AvgCnt)).
  111. calcAvgT([not_support | _], Num) ->
  112. <<"notSupport">>;
  113. calcAvgT([skip | _], Num) ->
  114. <<"skip">>;
  115. calcAvgT(CntList, Num) ->
  116. %% 去掉最大值与最小值 然后求平均值
  117. AvgCnt = ?Cnt - 2,
  118. SortList = lists:sort(CntList),
  119. AvgList = lists:sublist(SortList, 2, AvgCnt),
  120. float_to_list(lists:sum(AvgList) / AvgCnt / Num, [{decimals, 2}]) ++ "ns".
  121. storeStatistics(Ds, Num, Insert, Read, Update, For, Delete, TermSize) ->
  122. #tempCnt{insert = InsertList, read = ReadList, update = UpdateList, for = ForList, delete = DeleteList, size = SizeList} =
  123. case erlang:get({Ds, Num}) of
  124. undefined ->
  125. #tempCnt{};
  126. TempCnt ->
  127. TempCnt
  128. end,
  129. NewTempCnt = #tempCnt{insert = [Insert | InsertList], read = [Read | ReadList], update = [Update | UpdateList], for = [For | ForList], delete = [Delete | DeleteList], size = [TermSize | SizeList]},
  130. erlang:put({Ds, Num}, NewTempCnt).
  131. getStatistics(Ds, Num) ->
  132. erlang:get({Ds, Num}).
  133. printTitle() ->
  134. 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",
  135. ["DsName", "V_Num", "insert", "insert/per", "read", "read/per", "update", "update/per", "for", "for/per", "delete", "delete/per", "termSize"]),
  136. printLog("~s ~n", [[$= || _ <- lists:seq(1, 145)]]).
  137. printAvg() ->
  138. printLog("~n~-10.s ~8.s ~12.s ~12.s ~14.s ~12.s ~12.s ~12.s~n",
  139. ["DsName", "V_Num", "insert/per", "read/per", "update/per", "for/per", "delete/per", "termSize"]),
  140. printLog("~s ~n", [[$= || _ <- lists:seq(1, 85)]]).
  141. printLog(Format, Args) ->
  142. % {ok, File} = file:open("src/docs/erlang-DsBenchMark.txt", [write, append]),
  143. % io:format(File, Format, Args),
  144. % file:close(File).
  145. io:format(Format, Args).
  146. makeK(N) ->
  147. case N rem 4 of
  148. 0 ->
  149. N;
  150. 1 ->
  151. {N, <<"test-testDs">>};
  152. 2 ->
  153. {N, test};
  154. 3 ->
  155. [N, test]
  156. end.
  157. makeV(N) ->
  158. case N rem 4 of
  159. 0 ->
  160. N;
  161. 1 ->
  162. {N, <<"test-testDs">>};
  163. 2 ->
  164. {N, 8787.87878, <<"test-testDs">>};
  165. 3 ->
  166. {N, test, [list, 123, 456.789, "test"], {23231, "gggggg"}, <<"12345678901234567890">>}
  167. end.
  168. makeV2(N) ->
  169. case N rem 4 of
  170. 0 ->
  171. {N, 8787.87878, <<"test-testDs">>};
  172. 1 ->
  173. {N, test, [list, 123, 456.789, "test"], {23231, "gggggg"}, <<"12345678901234567890">>};
  174. 2 ->
  175. N;
  176. 3 ->
  177. {N, <<"test-testDs">>}
  178. end.
  179. makeRandV() ->
  180. utGenTerm:any().