Add a failing benchmark for vector shrinking This introduces an ad-hoc framework for making benchmarking assertions, using cprof.
diff --git a/test/triq_bench_tests.erl b/test/triq_bench_tests.erl new file mode 100644 index 0000000..b79626f --- /dev/null +++ b/test/triq_bench_tests.erl
@@ -0,0 +1,57 @@ +%% Copyright (c) 2018 Krzysztof Jurewicz +%% +%% Licensed under the Apache License, Version 2.0 (the "License"); +%% you may not use this file except in compliance with the License. +%% You may obtain a copy of the License at +%% +%% http://www.apache.org/licenses/LICENSE-2.0 +%% +%% Unless required by applicable law or agreed to in writing, software +%% distributed under the License is distributed on an "AS IS" BASIS, +%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +%% See the License for the specific language governing permissions and +%% limitations under the License. + +-module(triq_bench_tests). + +-include_lib("triq/include/triq.hrl"). +-include_lib("eunit/include/eunit.hrl"). + +-define( + LET_PROF(Prof, FunCall, Assertions), + begin + _ = cprof:start(), + _ = FunCall, + _ = cprof:pause(), + Prof = cprof:analyse(), + _ = cprof:stop(), + Assertions + end). + +-spec call_count( + mfa(), + {integer(), + list( + {Mod :: atom(), + ModCallCount :: integer(), + [{mfa(), integer()}]})}) + -> integer(). +%% @doc Extract call count for a specific MFA from CProf results. +call_count({Mod, _, _}=MFA, {_, ResultsPerMod}) -> + {_, _, ModResults} = lists:keyfind(Mod, 1, ResultsPerMod), + proplists:get_value(MFA, ModResults, 0). + +%% When looking for optimization opportunities in Triq, one can try to tighten +%% assertions in the tests below. + +constant_singleton_vector_test() -> + ?LET_PROF( + Prof, + triq:counterexample( + ?FORALL( + _, + vector(1, return(foo)), + false)), + ?assertMatch( + C when C =< 25000, call_count( + {triq_dom, shrink_list_members, 4}, Prof))).