1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
%% Copyright (c) 2013, Loïc Hoguin <[email protected]>
%%
%% Permission to use, copy, modify, and/or distribute this software for any
%% purpose with or without fee is hereby granted, provided that the above
%% copyright notice and this permission notice appear in all copies.
%%
%% THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
%% WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
%% MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
%% ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
%% WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
%% ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
%% OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-module(horse).
-export([app_perf/1]).
-export([mod_perf/1]).
%% These might be interesting later on.
%% @todo horse_init, horse_end
%% @todo horse_init_per_test, horse_end_per_test
app_perf(App) when is_atom(App) ->
io:format("Running horse on application ~s~n", [App]),
ok = application:load(App),
{ok, Modules} = application:get_key(App, modules),
_ = [mod_perf(M) || M <- lists:sort(Modules)],
ok.
mod_perf(Mod) when is_atom(Mod) ->
Perfs = [F || {F, 0} <- Mod:module_info(exports),
"horse_" =:= string:substr(atom_to_list(F), 1, 6)],
_ = [fun_perf(Mod, Fun) || Fun <- Perfs],
ok.
fun_perf(Mod, Fun) when is_atom(Mod), is_atom(Fun) ->
%% Dry run.
_ = Mod:Fun(),
%% Proper run.
Before = os:timestamp(),
_Val = Mod:Fun(),
After = os:timestamp(),
%% Results.
Time = timer:now_diff(After, Before),
"horse_" ++ Name = atom_to_list(Fun),
io:format("~s:~s in ~b.~6.10.0bs~n",
[Mod, Name, Time div 1000000, Time rem 1000000]),
ok.
|