From 6f4f1b9560e57860f353e77ebc4f2ce25e069a87 Mon Sep 17 00:00:00 2001 From: Martin Sumner Date: Wed, 7 Nov 2018 16:57:00 +0000 Subject: [PATCH] Add membership timing tests - sets vs lists --- test/member_test.erl | 51 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 test/member_test.erl diff --git a/test/member_test.erl b/test/member_test.erl new file mode 100644 index 0000000..e5fe5b3 --- /dev/null +++ b/test/member_test.erl @@ -0,0 +1,51 @@ +-module(member_test). + +-export([test_membership/0]). + +-define(SEGMENTS_TO_CHECK, 32768). % a whole SST file +-define(MEMBERSHIP_LENGTHS, [8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096]). + +segments(Length) -> + AllSegs = lists:seq(1, ?SEGMENTS_TO_CHECK), + AllSegsBin = + lists:foldl(fun(I, Acc) -> <> end, + <<>>, + AllSegs), + StartPos = random:uniform(length(AllSegs) - Length), + {<>, + lists:sublist(AllSegs, StartPos, Length)}. + +test_membership(Length) -> + {AllSegsBin, TestList} = segments(Length), + ExpectedOutput = + lists:reverse(TestList ++ TestList ++ TestList ++ TestList), + + SW0 = os:timestamp(), + TestListFun = fun(I) -> lists:member(I, TestList) end, + true = test_binary(AllSegsBin, [], TestListFun) == ExpectedOutput, + ListT = timer:now_diff(os:timestamp(), SW0) / 131072, + + SW1 = os:timestamp(), + TestSet = sets:from_list(TestList), + TestSetsFun = fun(I) -> sets:is_element(I, TestSet) end, + true = test_binary(AllSegsBin, [], TestSetsFun) == ExpectedOutput, + SetsT = timer:now_diff(os:timestamp(), SW1) / 131072, + + io:format("Test with segment count ~w ..." + ++ " took ~w ms per 1000 checks with list ..." + ++ " took ~w ms per 1000 checks with set~n", [Length, ListT, SetsT]). + + +test_binary(<<>>, Acc, _TestFun) -> + Acc; +test_binary(<<0:1/integer, TestSeg:15/integer, Rest/binary>>, Acc, TestFun) -> + case TestFun(TestSeg) of + true -> + test_binary(Rest, [TestSeg|Acc], TestFun); + false -> + test_binary(Rest, Acc, TestFun) + end. + +test_membership() -> + lists:foreach(fun(I) -> test_membership(I) end, ?MEMBERSHIP_LENGTHS). \ No newline at end of file