123 lines
3.0 KiB
Plaintext
123 lines
3.0 KiB
Plaintext
|
|
||
|
% benchmark a goal using a default number of repetitions and printing some
|
||
|
% useful statistics
|
||
|
|
||
|
benchmark(Goal) :-
|
||
|
N = 100000,
|
||
|
benchmark(Goal, N, Looptime, Goaltime, Average, Speed),
|
||
|
report(Goal, N, Looptime, Goaltime, Average, Speed).
|
||
|
|
||
|
|
||
|
benchmark(Goal, N) :-
|
||
|
benchmark(Goal, N, Looptime, Goaltime, Average, Speed),
|
||
|
report(Goal, N, Looptime, Goaltime, Average, Speed).
|
||
|
|
||
|
|
||
|
benchmark(Goal, N, Looptime, Goaltime, Average, Speed) :-
|
||
|
'$lgt_cpu_time'(Seconds1), % defined in the config files
|
||
|
do_benchmark(N, true),
|
||
|
'$lgt_cpu_time'(Seconds2),
|
||
|
Looptime is Seconds2 - Seconds1,
|
||
|
'$lgt_cpu_time'(Seconds3),
|
||
|
do_benchmark(N, Goal),
|
||
|
'$lgt_cpu_time'(Seconds4),
|
||
|
Goaltime is Seconds4 - Seconds3,
|
||
|
Average is (Goaltime - Looptime)/N,
|
||
|
Speed is 1.0/Average.
|
||
|
|
||
|
|
||
|
report(Id, Goal, N, Looptime, Goaltime, Average, Speed) :-
|
||
|
write(Id), write(': '),
|
||
|
report(Goal, N, Looptime, Goaltime, Average, Speed).
|
||
|
|
||
|
|
||
|
report(Goal, N, Looptime, Goaltime, Average, Speed) :-
|
||
|
writeq(Goal), nl,
|
||
|
write('Number of repetitions: '), write(N), nl,
|
||
|
write('Loop time: '), write(Looptime), nl,
|
||
|
write('Goal time: '), write(Goaltime), nl,
|
||
|
write('Average time per call: '), write(Average), nl,
|
||
|
write('Number of calls per second: '), write(Speed), nl,
|
||
|
nl.
|
||
|
|
||
|
|
||
|
% repeat a goal N times using a failure-driven loop to avoid the interference
|
||
|
% of Prolog compiler memory management mechanism (such as garbage collection)
|
||
|
% on the results
|
||
|
|
||
|
do_benchmark(N, Goal) :-
|
||
|
repeat(N), % another option would be to use a between/3 built-in predicate
|
||
|
call(Goal),
|
||
|
fail.
|
||
|
|
||
|
do_benchmark(_, _).
|
||
|
|
||
|
|
||
|
% some Prolog compilers define the predicate repeat/1 as a built-in predicate;
|
||
|
% if that's the case of the Prolog compiler you are using, then comment out
|
||
|
% the definition that follows
|
||
|
|
||
|
repeat(_).
|
||
|
|
||
|
repeat(N) :-
|
||
|
N > 1,
|
||
|
N2 is N - 1,
|
||
|
repeat(N2).
|
||
|
|
||
|
|
||
|
% generate a list containing the first N non-negative integers
|
||
|
|
||
|
generate_list(N, List) :-
|
||
|
N >= 0,
|
||
|
generate_list(0, N, List).
|
||
|
|
||
|
|
||
|
generate_list(N, N, []) :-
|
||
|
!.
|
||
|
|
||
|
generate_list(M, N, [M| Ms]) :-
|
||
|
M < N,
|
||
|
M2 is M + 1,
|
||
|
generate_list(M2, N, Ms).
|
||
|
|
||
|
|
||
|
% utility predicate for running all benchmark tests
|
||
|
|
||
|
benchmarks :-
|
||
|
N = 100000,
|
||
|
benchmark_goal(Id, Goal),
|
||
|
benchmark(Goal, N, Looptime, Goaltime, Average, Speed),
|
||
|
report(Id, Goal, N, Looptime, Goaltime, Average, Speed),
|
||
|
fail.
|
||
|
|
||
|
benchmarks.
|
||
|
|
||
|
|
||
|
% some benchmark tests for static code:
|
||
|
|
||
|
benchmark_goal('S1', my_length(List, _)) :-
|
||
|
generate_list(30, List).
|
||
|
|
||
|
benchmark_goal('S2', object::length(List, _)) :-
|
||
|
generate_list(30, List).
|
||
|
|
||
|
benchmark_goal('S3', '$lgt_send_to_object_nv'(object, length(List, _), user)) :-
|
||
|
generate_list(30, List).
|
||
|
|
||
|
benchmark_goal('S4', '$lgt_send_to_object_ne_nv'(object, length(List, _), user)) :-
|
||
|
generate_list(30, List).
|
||
|
|
||
|
|
||
|
% some benchmark tests for dynamic code:
|
||
|
|
||
|
benchmark_goal('D1', (create_object(xpto, [], [], []), abolish_object(xpto))).
|
||
|
|
||
|
benchmark_goal('D2', db_test_plain).
|
||
|
|
||
|
benchmark_goal('D3', '$lgt_send_to_object_ne_nv'(database, db_test_this, user)).
|
||
|
|
||
|
benchmark_goal('D4', '$lgt_send_to_object_ne_nv'(database, db_test_self, user)).
|
||
|
|
||
|
benchmark_goal('D5', '$lgt_send_to_object_ne_nv'(database, db_test_obj, user)).
|
||
|
|