diff options
author | Magnus Ahltorp <map@kth.se> | 2016-02-10 11:11:16 +0100 |
---|---|---|
committer | Linus Nordberg <linus@nordu.net> | 2016-04-25 13:14:10 +0200 |
commit | f576ef7e0ec4317f0ff2f632ae8c2312dc916673 (patch) | |
tree | fbcdd66b9fe2fd0e0ad0ad84e600d866483a8b12 /test/permdbbench.erl | |
parent | 7f15cd5a881d2d14f80ddf5219577561d3d91eeb (diff) |
Rough implementation of new permdb format.
Added regression tests and benchmarks.
Chunks not implemented yet.
Diffstat (limited to 'test/permdbbench.erl')
-rwxr-xr-x | test/permdbbench.erl | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/test/permdbbench.erl b/test/permdbbench.erl new file mode 100755 index 0000000..ade9c34 --- /dev/null +++ b/test/permdbbench.erl @@ -0,0 +1,119 @@ +#!/usr/bin/env escript +%% -*- erlang -*- +%%! -pa ebin -pa ../lager/ebin -pa ../lager/deps/goldrush/ebin + +-mode(compile). + +gentestdata(Size) -> + [{crypto:hash(sha256, <<E:32, 0:32>>), crypto:hash(sha256, <<E:32, 1:32>>)} || E <- lists:seq(0, Size-1)]. + +timeprint(Time) -> + io_lib:format("~.2fs", [Time/1000000]). + +testinit(Filename) -> + permdb:start_link(testdb, Filename). + +teststop() -> + permdb:stop(testdb). + +constructdata(VSeed, Size) -> + A = binary:copy(VSeed, Size div 32), + B = binary:part(VSeed, 0, Size rem 32), + <<A/binary, B/binary>>. + +getvalue_loop([], _Port, _Datasize) -> + none; +getvalue_loop([{K, VSeed}|Rest], Port, Datasize) -> + V = case VSeed of + noentry -> + noentry; + _ -> + constructdata(VSeed, Datasize) + end, + case permdb:getvalue(testdb, K) of + V -> + getvalue_loop(Rest, Port, Datasize); + VOther -> + io:format("expected: ~p got: ~p~nkey: ~p~n", [V, VOther, K]), + exit(mismatch) + end. + +addvalue_loop([], _Port, _Datasize) -> + none; +addvalue_loop([{K, VSeed}|Rest], Port, Datasize) -> + V = constructdata(VSeed, Datasize), + case permdb:addvalue(testdb, K, V) of + ok -> + addvalue_loop(Rest, Port, Datasize); + Other -> + io:format("expected: 0 or 1 got: ~p~n", [Other]), + exit(mismatch) + end. + +testget(_Filename, TestData, Datasize) -> + getvalue_loop(TestData, none, Datasize), + ok. + +testadd(_Filename, TestData, Datasize) -> + addvalue_loop(TestData, none, Datasize), + case permdb:commit(testdb) of + <<0>> -> + ok; + Other -> + io:format("commit expected: 0 got: ~p~n", [Other]), + exit(mismatch) + end. + +stop() -> + teststop(), + receive + after + 100 -> + ok + end. + +runbench(Fun, Size, Verb) -> + {Time2, ok} = timer:tc(Fun), + io:format("~s ~p entries: ~s ~.1f entries/s (~.2f microseconds)~n", [Verb, Size, timeprint(Time2), Size*1000000/Time2, Time2/Size]). + +chunk([], N) -> + []; +chunk(List, N) -> + First = lists:sublist(List, N), + Rest = lists:nthtail(N, List), + [First | chunk(Rest, N)]. + +main([]) -> + {ok, Cwd} = file:get_cwd(), + code:add_path(Cwd ++ "/ebin"), + Size = 20000, + Datasize = 1000, + ChunkSize = 1000, + Filename = "testpermdb", + file:delete(Filename), + file:delete(Filename ++ ".idx"), + {Time1, TestData} = timer:tc(fun () -> gentestdata(Size) end), + TestDataLists = chunk(TestData, ChunkSize), + io:format("Init with ~p entries: ~s~n", [Size, timeprint(Time1)]), + testinit(Filename), + runbench(fun () -> + lists:foreach(fun (E) -> + testadd(Filename, E, Datasize) + end, TestDataLists) + end, Size, "Add"), + runbench(fun () -> testget(Filename, TestData, Datasize) end, Size, "Get"), + stop(), + + testinit(Filename), + runbench(fun () -> testget(Filename, TestData, Datasize) end, Size, "Get"), + stop(), + + file:delete(Filename ++ ".idx"), + + testinit(Filename), + runbench(fun () -> testget(Filename, [hd(TestData)], Datasize) end, Size, "Rebuild"), + runbench(fun () -> testget(Filename, TestData, Datasize) end, Size, "Get"), + stop(), + + ok. + |