File 1803-megaco-Add-a-bench-group-with-one-initial-test-case-.patch of Package erlang
From fc1c03f65ec3b345307c14594ecf0cfb6c133dc8 Mon Sep 17 00:00:00 2001
From: Micael Karlberg <bmk@erlang.org>
Date: Mon, 7 Apr 2025 14:10:37 +0200
Subject: [PATCH 3/7] [megaco] Add a bench group with one initial test case
(meas)
---
.../examples/meas/megaco_codec_meas.erl | 64 +++++++++++++++++--
lib/megaco/test/megaco_bench.spec | 2 +-
lib/megaco/test/megaco_examples_SUITE.erl | 64 +++++++++++++++++--
3 files changed, 118 insertions(+), 12 deletions(-)
diff --git a/lib/megaco/examples/meas/megaco_codec_meas.erl b/lib/megaco/examples/meas/megaco_codec_meas.erl
index d2fd24dd1b..339e6c0cae 100644
--- a/lib/megaco/examples/meas/megaco_codec_meas.erl
+++ b/lib/megaco/examples/meas/megaco_codec_meas.erl
@@ -176,7 +176,8 @@ meas_init(Factor, Opts, MessagePackage, Codecs) ->
ExpandedMessages = expand_messages(Codecs, Messages),
Results = t1(Factor, Opts, ExpandedMessages, []),
display_time(Started, os:timestamp()),
- store_results(Results);
+ %% store_results(Results);
+ process_results(Opts, Results);
Error ->
Error
end.
@@ -334,9 +335,7 @@ measure(_Factor, _Opts, _Dir, _Codec, _Conf, [], [], _MCount) ->
measure(_Factor, _Opts, _Dir, _Codec, _Conf, [], Res, _MCount) ->
- Eavg = avg([Etime/Ecnt || #stat{ecount = Ecnt, etime = Etime} <- Res]),
- Davg = avg([Dtime/Dcnt || #stat{dcount = Dcnt, dtime = Dtime} <- Res]),
- Savg = avg([Size || #stat{size = Size} <- Res]),
+ {Savg, Eavg, Davg} = process_measure_results(Res),
io:format("~n[~s] Measurment on ~p messages:"
"~n Average:"
@@ -378,6 +377,13 @@ measure(Factor, #{verbose := Verbose} = Opts,
end.
+process_measure_results(Res) when is_list(Res) ->
+ Savg = avg([Size || #stat{size = Size} <- Res]),
+ Eavg = avg([Etime/Ecnt || #stat{ecount = Ecnt, etime = Etime} <- Res]),
+ Davg = avg([Dtime/Dcnt || #stat{dcount = Dcnt, dtime = Dtime} <- Res]),
+ {Savg, Eavg, Davg}.
+
+
do_measure(Factor, Opts, _Id, Codec, Conf, Name, BinMsg, MCount) ->
%% io:format("~n~s~n", [binary_to_list(BinMsg)]),
@@ -510,6 +516,50 @@ do_measure_codec_loop(Codec, Func, Conf, Version, Bin, Count, _) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+process_results(#{bench := true}, Results) ->
+ ProcessedResults = process_bench_results(Results),
+ {bench, ProcessedResults};
+process_results(_, Results) ->
+ store_results(Results).
+
+process_bench_results(Results) ->
+ process_bench_results(Results, []).
+
+process_bench_results([] = _Results, AccProcessedResults) ->
+ lists:reverse(AccProcessedResults);
+process_bench_results([{BaseName, Config, Result} | Results],
+ AccProcessedResults) ->
+ Name = process_bench_result_name(BaseName, Config),
+ ProcessedResult = process_measure_results(Result),
+ process_bench_results(Results,
+ [{Name, ProcessedResult} | AccProcessedResults]).
+
+process_bench_result_name(pretty = BaseName, []) ->
+ BaseName;
+process_bench_result_name(pretty = BaseName, [flex_scanner]) ->
+ list_to_atom(f("~w_~w", [BaseName, flex]));
+process_bench_result_name(compact = BaseName, []) ->
+ BaseName;
+process_bench_result_name(compact = BaseName, [flex_scanner]) ->
+ list_to_atom(f("~w_~w", [BaseName, flex]));
+process_bench_result_name(ber = BaseName, []) ->
+ BaseName;
+process_bench_result_name(ber = BaseName, [native]) ->
+ list_to_atom(f("~w_~w", [BaseName, native]));
+process_bench_result_name(per = BaseName, []) ->
+ BaseName;
+process_bench_result_name(per = BaseName, [native]) ->
+ list_to_atom(f("~w_~w", [BaseName, native]));
+process_bench_result_name(erlang, []) ->
+ erl;
+process_bench_result_name(erlang, [megaco_compressed]) ->
+ erl_mc;
+process_bench_result_name(erlang, [compressed]) ->
+ erl_c;
+process_bench_result_name(erlang, [megaco_compressed, compressed]) ->
+ erl_mc_c.
+
+
store_results(Results) ->
io:format("storing: ~n", []),
store_excel_message_size(Results),
@@ -700,6 +750,12 @@ vprint(_, _, _) ->
ok.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+f(F, A) ->
+ lists:flatten(io_lib:format(F, A)).
+
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
info(F, A) ->
diff --git a/lib/megaco/test/megaco_bench.spec b/lib/megaco/test/megaco_bench.spec
index 385019c3c7..5129b94f78 100644
--- a/lib/megaco/test/megaco_bench.spec
+++ b/lib/megaco/test/megaco_bench.spec
@@ -20,4 +20,4 @@
%% %CopyrightEnd%
%%
-{groups,"../megaco_test",megaco_examples_SUITE,[meas]}.
+{groups,"../megaco_test",megaco_examples_SUITE,[bench]}.
diff --git a/lib/megaco/test/megaco_examples_SUITE.erl b/lib/megaco/test/megaco_examples_SUITE.erl
index a2fa78f0c1..943e209d7c 100644
--- a/lib/megaco/test/megaco_examples_SUITE.erl
+++ b/lib/megaco/test/megaco_examples_SUITE.erl
@@ -35,7 +35,7 @@
simple/1,
- meas/1,
+ meas/1, bench_meas/1,
mstone1/1,
mstone2/1
@@ -43,6 +43,7 @@
-include_lib("common_test/include/ct.hrl").
+-include_lib("common_test/include/ct_event.hrl").
-include("megaco_test_lib.hrl").
-include_lib("megaco/include/megaco.hrl").
-include_lib("megaco/include/megaco_message_v1.hrl").
@@ -52,6 +53,9 @@
%%======================================================================
%% Common Test interface functions
+%%
+%% The difference between the bench cases and the meas cases is simply
+%% how the results are reported.
%%======================================================================
suite() ->
@@ -60,12 +64,14 @@ suite() ->
all() ->
[
simple,
- {group, meas}
+ {group, meas},
+ {group, bench}
].
groups() ->
[
- {meas, [], meas_cases()}
+ {meas, [], meas_cases()},
+ {bench, [], bench_cases()}
].
meas_cases() ->
@@ -75,6 +81,12 @@ meas_cases() ->
mstone2
].
+bench_cases() ->
+ [
+ bench_meas%% ,
+ %% bench_mstone1,
+ %% bench_mstone2
+ ].
%%
@@ -156,7 +168,8 @@ init_per_testcase(simple = Case, Config) ->
megaco_test_lib:init_per_testcase(Case, Config);
-init_per_testcase(meas = Case, Config) ->
+init_per_testcase(Case, Config) when (Case =:= meas) orelse
+ (Case =:= bench_meas) ->
p("init_per_testcase -> entry with"
"~n Config: ~p"
@@ -229,7 +242,8 @@ end_per_testcase(simple = Case, Config) ->
megaco_test_lib:end_per_testcase(Case, Config);
-end_per_testcase(meas = Case, Config) ->
+end_per_testcase(Case, Config) when (Case =:= meas) orelse
+ (Case =:= bench_meas) ->
p("end_per_testcase -> entry with"
"~n Config: ~p"
@@ -613,6 +627,9 @@ users(Proxy) ->
meas(suite) ->
[];
meas(Config) when is_list(Config) ->
+ common_meas(?FUNCTION_NAME, #{}, Config).
+
+common_meas(TC, Opts0, Config) when is_map(Opts0) ->
Pre = fun() ->
MFactor = ?config(megaco_factor, Config),
{Time, Factor} =
@@ -639,12 +656,12 @@ meas(Config) when is_list(Config) ->
WorkerNode = ?config(worker_node, Config),
{Factor, WorkerNode}
end,
- Opts = #{verbose => false},
+ Opts = Opts0#{verbose => false},
Case = fun({Factor, WorkerNode}) ->
do_meas(WorkerNode, megaco_codec_meas, start, [Factor, Opts])
end,
Post = fun(_) -> ok end,
- try_tc(?FUNCTION_NAME, Pre, Case, Post).
+ try_tc(TC, Pre, Case, Post).
do_meas(Node, Mod, Func, Args) ->
F = fun() ->
@@ -654,6 +671,12 @@ do_meas(Node, Mod, Func, Args) ->
{Pid, MRef} = spawn_monitor(F),
p("await completion"),
receive
+ {'DOWN', MRef, process, Pid, {bench, Results}} ->
+ p("worker process terminated with bench results: "
+ "~n ~p", [Results]),
+ publish_bench_results(meas, Results),
+ ok;
+
{'DOWN', MRef, process, Pid,
{error, {failed_loading_flex_scanner_driver, Reason}}} ->
p("<ERROR> worker process failed loading flex scanner: "
@@ -682,6 +705,16 @@ do_meas(Node, Mod, Func, Args) ->
ok.
+publish_bench_results(_Pre, []) ->
+ ok;
+publish_bench_results(Pre, [{Name, {_, Enc, Dec}} | Results]) ->
+ Event = #event{name = list_to_atom(?F("~w_~w", [Pre, Name])),
+ data = [{suite, atom_to_list(?MODULE)},
+ {value, Enc + Dec}]},
+ ct_event:notify(Event),
+ publish_bench_results(Pre, Results).
+
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -748,6 +781,23 @@ mstone2(Config) when is_list(Config) ->
try_tc(?FUNCTION_NAME, Pre, Case, Post).
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%% ------------------ bench:meas ------------------------
+
+bench_meas(suite) ->
+ [];
+bench_meas(Config) when is_list(Config) ->
+ common_meas(?FUNCTION_NAME, #{bench => true}, Config).
+
+
+%% ------------------ bench:mstone1 ---------------------
+%% ------------------ bench:mstone2 ---------------------
+
+
+
+
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
start_unique_node(Pre) ->
--
2.43.0