/contrib/ebench.erl

https://github.com/dergraf/ernie · Erlang · 76 lines · 60 code · 10 blank · 6 comment · 0 complexity · f0c358088a0008752b242c99df7fe40c MD5 · raw file

  1. % erlc *.erl && erl ebench.beam -run ebench start 10000 20 ext add
  2. -module(ebench).
  3. -export([start/1]).
  4. start([Ni, Ci, Modi, Funi]) ->
  5. Nt = list_to_integer(Ni),
  6. C = list_to_integer(Ci),
  7. Mod = list_to_atom(Modi),
  8. Fun = list_to_atom(Funi),
  9. N = round(Nt / C),
  10. T0 = erlang:now(),
  11. Waiter = spawn(fun() -> wait(T0, N * C) end),
  12. spawner(Waiter, N, C, Mod, Fun).
  13. spawner(_Waiter, _N, 0, _Mod, _Fun) ->
  14. ok;
  15. spawner(Waiter, N, C, Mod, Fun) ->
  16. spawn(fun() -> loop(Waiter, N, Mod, Fun) end),
  17. spawner(Waiter, N, C - 1, Mod, Fun).
  18. % X is the total number of responses to wait for
  19. wait(T0, XTotal, 0) ->
  20. T1 = erlang:now(),
  21. Diff = timer:now_diff(T1, T0),
  22. Mean = Diff / XTotal,
  23. io:format("~p requests completed in ~.2fs~n", [XTotal, Diff / 1000000]),
  24. io:format("Mean request time: ~.2fms (~.2f r/s)~n", [Mean / 1000, XTotal / (Diff / 1000000)]),
  25. init:stop();
  26. wait(T0, XTotal, X) ->
  27. receive
  28. done -> wait(T0, XTotal, X - 1)
  29. end.
  30. wait(T0, X) ->
  31. wait(T0, X, X).
  32. loop(_Waiter, 0, _Mod, _Fun) ->
  33. ok;
  34. loop(Waiter, N, Mod, Fun) ->
  35. hit(Waiter, Mod, Fun),
  36. loop(Waiter, N - 1, Mod, Fun).
  37. hit(Waiter, Mod, Fun) ->
  38. % io:format("outgoing!~n", []),
  39. Host = "localhost",
  40. case gen_tcp:connect(Host, 8000, [binary, {packet, 4}]) of
  41. {ok, Sock} -> process(Waiter, Mod, Fun, Sock);
  42. Any ->
  43. io:format("Unable to establish connection: ~p~n", [Any]),
  44. Waiter ! done
  45. end.
  46. process(Waiter, Mod, Fun, Sock) ->
  47. % Info = term_to_binary({info, priority, [low]}),
  48. % ok = gen_tcp:send(Sock, Info),
  49. Request = term_to_binary({call, Mod, Fun, args(Fun)}),
  50. ok = gen_tcp:send(Sock, Request),
  51. receive
  52. {tcp, _Port, Reply} ->
  53. % io:format("~p~n", [Reply]),
  54. Res = res(Fun),
  55. {reply, Res} = binary_to_term(Reply);
  56. {tcp_closed, Port} ->
  57. io:format("Connection closed after sending data: ~p~n", [Port]);
  58. Any ->
  59. io:format("Unexpected message: ~p~n", [Any])
  60. end,
  61. Waiter ! done,
  62. ok = gen_tcp:close(Sock).
  63. args(add) -> [1, 2];
  64. args(fib) -> [20].
  65. res(add) -> 3;
  66. res(fib) -> 10946.