File 2197-Improve-measure-1.patch of Package erlang
From 79a4a923775e81e115d4da38d5628f96b309f2f8 Mon Sep 17 00:00:00 2001
From: Raimo Niskanen <raimo@erlang.org>
Date: Sat, 2 Apr 2022 00:37:39 +0200
Subject: [PATCH 07/11] Improve measure/1
* Add clause to call measure(Effort) without test framework
* Increase loop unrolling from 10 to 50
* Measure splitmix64_next/1
---
lib/stdlib/test/rand_SUITE.erl | 58 ++++++++++++++++++++++++++--------
1 file changed, 44 insertions(+), 14 deletions(-)
diff --git a/lib/stdlib/test/rand_SUITE.erl b/lib/stdlib/test/rand_SUITE.erl
index d2d729b594..c6762c1626 100644
--- a/lib/stdlib/test/rand_SUITE.erl
+++ b/lib/stdlib/test/rand_SUITE.erl
@@ -1064,12 +1064,15 @@ measure(Config) when is_list(Config) ->
ct:timetrap({minutes,60}), %% valgrind needs a lot of time
case ct:get_timetrap_info() of
{_,{_,1}} -> % No scaling
- Iterations = ?LOOP div 5,
Effort = proplists:get_value(measure_effort, Config, 1),
- do_measure(Iterations * Effort);
+ measure(Effort);
{_,{_,Scale}} ->
{skip,{will_not_run_in_scaled_time,Scale}}
- end.
+ end;
+measure(Effort) when is_integer(Effort) ->
+ Iterations = ?LOOP div 5,
+ do_measure(Iterations * Effort).
+
-define(CHECK_UNIFORM_RANGE(Gen, Range, X, St),
case (Gen) of
@@ -1190,7 +1193,7 @@ do_measure(Iterations) ->
end
end
end,
- system_time_rem, Iterations,
+ system_time, Iterations,
TMarkUniformRange10000, OverheadUniformRange1000),
%%
ct:pal("~nRNG uniform integer 32 bit performance~n",[]),
@@ -1263,7 +1266,7 @@ do_measure(Iterations) ->
end
end
end,
- system_time_rem, Iterations,
+ system_time, Iterations,
TMarkUniform32Bit, OverheadUniform32Bit),
%%
ct:pal("~nRNG uniform integer half range performance~n",[]),
@@ -1340,14 +1343,28 @@ do_measure(Iterations) ->
end,
lcg35_inline, Iterations,
TMarkUniformFullRange, OverheadUniformFullRange),
+ _ =
+ measure_1(
+ fun (_Mod, _State) ->
+ Range = 1 bsl 64,
+ fun (St0) ->
+ {V, St1} = rand:splitmix64_next(St0),
+ if
+ is_integer(V), 0 =< V, V < Range ->
+ St1
+ end
+ end
+ end,
+ splitmix64_inline, Iterations,
+ TMarkUniformFullRange, OverheadUniformFullRange),
_ =
measure_1(
fun (_Mod, _State) ->
Range = 1 bsl 58,
fun (St0) ->
{V, St1} = rand:exsp_next(St0),
- case V of
- V when is_integer(V), 0 =< V, V < Range ->
+ if
+ is_integer(V), 0 =< V, V < Range ->
St1
end
end
@@ -1436,7 +1453,7 @@ do_measure(Iterations) ->
end, Algs, Iterations),
%%
ct:pal("~nRNG uniform integer 64 bit performance~n",[]),
- _ =
+ [TMarkUniform64Bit, OverheadUniform64Bit | _] =
measure_1(
fun (Mod, _State) ->
Range = 1 bsl 64,
@@ -1446,6 +1463,20 @@ do_measure(Iterations) ->
Generator(Range, St0), Range, X, St1)
end
end, Algs, Iterations),
+ _ =
+ measure_1(
+ fun (_Mod, _State) ->
+ Range = 1 bsl 64,
+ fun (St0) ->
+ {V, St1} = rand:splitmix64_next(St0),
+ if
+ is_integer(V), 0 =< V, V < Range ->
+ St1
+ end
+ end
+ end,
+ splitmix64_inline, Iterations,
+ TMarkUniform64Bit, OverheadUniform64Bit),
%%
ByteSize = 16, % At about 100 bytes crypto_bytes breaks even to exsss
ct:pal("~nRNG ~w bytes performance~n",[ByteSize]),
@@ -1565,11 +1596,8 @@ do_measure(Iterations) ->
measure_loop(State, Fun, I) when 10 =< I ->
%% Loop unrolling to dilute benchmark overhead...
measure_loop(
- Fun(Fun(Fun(Fun(Fun(
- Fun(Fun(Fun(Fun(Fun(
- State)))))))))),
- Fun,
- I - 10);
+ Fun(Fun(Fun(Fun(Fun( Fun(Fun(Fun(Fun(Fun(State))))) ))))),
+ Fun, I - 10);
measure_loop(State, Fun, I) when 1 =< I ->
measure_loop(Fun(State), Fun, I - 1);
measure_loop(_, _, _) ->
@@ -1644,7 +1672,7 @@ measure_init(Alg) ->
{?MODULE, <<>>};
unique_phash2 ->
{?MODULE, undefined};
- system_time_rem ->
+ system_time ->
{?MODULE, undefined};
mcg35_inline ->
{_, S} = rand:seed_s(dummy),
@@ -1652,6 +1680,8 @@ measure_init(Alg) ->
lcg35_inline ->
{_, S} = rand:seed_s(dummy),
{rand, S bsr (58-35)};
+ splitmix64_inline ->
+ {rand, erlang:unique_integer()};
lcg35_procdict ->
{_, S} = rand:seed_s(dummy),
_ = put(Alg, S bsr (58-35)),
--
2.34.1