-module(load_test_lager). -define(PRINT_MSG(Format, Args), io:format(Format, Args)). -define(DEBUG_MSG(Format, Args), lager:debug(Format, Args)). -define(INFO_MSG(Format, Args), lager:info(Format, Args)). -define(WARNING_MSG(Format, Args), lager:warning(Format, Args)). -define(ERROR_MSG(Format, Args), lager:error(Format, Args)). % stacktrace -ifdef(OTP_RELEASE). %% this implies 21 or higher -define(EXCEPTION(Class, Reason, Stacktrace), Class:Reason:Stacktrace). -define(GET_STACK(Stacktrace), Stacktrace). -else. -define(EXCEPTION(Class, Reason, _), Class:Reason). -define(GET_STACK(_), erlang:get_stacktrace()). -endif. -export([ bench/2 ]). bench(Number, Concurrency) -> application:ensure_all_started(lager), gen_event:delete_handler(lager_event, lager_console_backend, []), ok = lager:set_loglevel(lager_file_backend, "log/applog.log", warning), Self = self(), List = lists:seq(1, Concurrency), LoopNumbers = Number div Concurrency, Fun = fun() -> try ?INFO_MSG("hello world", []) catch ?EXCEPTION(Class, Error, Stack) -> io:format("received error class: ~p error: ~p stack: ~p ~n", [Class, Error, ?GET_STACK(Stack)]) end end, A = os:timestamp(), Pids = [spawn_link(fun() -> loop(LoopNumbers, Fun), Self ! {self(), done} end) || _ <- List], [receive {Pid, done} -> ok end || Pid <- Pids], B = os:timestamp(), print(Number, A, B). print(Num, A, B) -> Microsecs = timer:now_diff(B, A), Time = Microsecs div Num, PerSec = case Time of 0 -> "N/A"; _ -> 1000000 div Time end, io:format("### ~p ms ~p req/sec ~n", [Microsecs div 1000, PerSec]). loop(0, _Fun) -> ok; loop(Nr, Fun) -> Fun(), loop(Nr-1, Fun).