/* The naive reverse benchmark */
:- main.
q:- statistics(runtime,[S|_]),
bench(250),
statistics(runtime,[S1|_]), Y is S1-S,
write('time : '), write(Y), nl,
halt_or_else(0,true).
nrev([],[]).
nrev([X|Rest],Ans):-
nrev(Rest,L), app(L,[X],Ans).
app([],L,L).
app([X|L1],L2,[X|L3]):-
app(L1,L2,L3).
bench(Count):-
statistics(runtime,[T0|_]),
dodummy(Count),
statistics(runtime,[T1|_]),
dobench(Count),
statistics(runtime,[T2|_]),
report(Count,T0,T1,T2).
dobench(Count):-
data(List),
repeat(Count),
nrev(List,_),
fail.
dobench(_).
dodummy(Count):-
data(List),
repeat(Count),
dummy(List,_),
fail.
dodummy(_).
dummy(_,_).
data(X):-
data(X,30).
data([],0).
data([a|Y],N):-
N > 0,
N1 is N-1,
data(Y,N1).
repeat(_N).
repeat(N):-
N > 1,
N1 is N-1,
repeat(N1).
report(Count,T0,T1,T2) :-
Time1 is T1-T0,
Time2 is T2-T1,
Time is Time2-Time1, /* Time spent on nreving lists */
Lips is (496*Count*1000)//Time,
write(Lips), write(' lips for '), write(Count),
write(' iterations taking '), write(Time),
write(' msec ('),
write(Time2-Time1), write(')'),
nl.
:- q.
syntax highlighted by Code2HTML, v. 0.9.1