Packages

Fast NIF-based CSV parser using libcsv

Current section

Files

Jump to
csve src csv_testbench.erl
Raw

src/csv_testbench.erl

-module(csv_testbench).
-export([run/0, run/1]).
run() ->
run("benchtest.csv").
run(Filename) ->
{ok, Csv} = file:read_file(filename:join([code:priv_dir(csv), Filename])),
FolderMaker = fun (_) ->
{fun(Row, Acc) -> [Row | Acc] end,
[5, 5, 1]}
end,
Generator = make_generator(Csv),
Timer = start_utimer(),
%%Decoded = csv:decode_binary(Csv),
Decoded = csv:decode_fold({maker, FolderMaker}, [], Generator),
RunTimeUs = stop_utimer(Timer),
#{run_time_ms => round(RunTimeUs / 1000),
decoded_rows => length(Decoded),
us_per_row => divide_and_round(RunTimeUs, length(Decoded)),
rows_per_second => round(length(Decoded) / (RunTimeUs / 1000000)),
first_row => hd(Decoded)}.
%% Internal
make_generator(Csv) ->
{fun generator/1, Csv}.
generator(done) ->
done;
generator(Csv) ->
{Csv, done}.
start_utimer() ->
erlang:system_time(micro_seconds).
stop_utimer(Timer) ->
erlang:system_time(micro_seconds) - Timer.
divide_and_round(_, 0) ->
infinity;
divide_and_round(Dividend, Divisor) ->
round(Dividend / Divisor).