% A generic benchmark harness #ifdef WAMCC :- main. #endif #ifdef AQUARIUS_ANALYZE :- option(analyze). #endif #ifdef QUINTUS runtime_entry(_) :- bench(REPEAT_COUNT). #else % NB Aquarius requires that main/0 be the first predicate in the file main :- bench(REPEAT_COUNT). main(_) :- main. #endif bench(Count) :- cputime(T1), dobench(Count), cputime(T2), report(Count, T1, T2). dobench(Count) :- data(Data), #ifndef PRINT_RESULT repeat(Count), #else write(Count), nl, #endif #ifdef PRINT_RESULT benchmark(Data, Result), printresult(Result), #else benchmark(Data, _Result), #endif fail. dobench(_). #ifdef PRINT_RESULT printresult(Result) :- write(Result), nl, !. #endif repeat(_N). repeat(N) :- N > 1, N1 is N - 1, repeat(N1). #ifdef WAMCC report(Count, T1, T2) :- RawTime is T2 - T1, RTime is RawTime // 1000, RTimeMod is RawTime mod 1000, system_name(SYSTEM, Sysname), variant_name(SYSTEM, VARIANT, Varname), write(Sysname), write(' '), write(Varname), write(' '), write(Count), write(' '), write(RTime), write('.'), format("%03d", [RTimeMod]), write(u), write(' '). #else report(Count, T1, T2) :- RawTime is T2 - T1, RTime is RawTime / 1000, system_name(SYSTEM, Sysname), variant_name(SYSTEM, VARIANT, Varname), write(Sysname), write(' '), write(Varname), write(' '), write(Count), write(' '), write(RTime), write(u), write(' '). #endif % get runtime so far in milliseconds. #if defined(NUPROLOG) cputime(T) :- statistics(L), member(utime = [T, _], L), !. #elif defined(SICSTUS) || defined(AQUARIUS) || defined(QUINTUS) cputime(T) :- statistics(runtime, [T, _]). #elif defined(SWIPROLOG) cputime(T) :- statistics(cputime, T1), T is T1 * 1000. #elif defined(WAMCC) % cputime/1 is a builtin #else #error Must define NUPROLOG, SICSTUS, AQUARIUS, SWIPROLOG, QUINTUS or WAMCC #endif system_name(0, mercury). system_name(1, nuprolog). system_name(2, sicstus). system_name(3, aquarius). system_name(4, swiprolog). system_name(5, quintus). system_name(6, wamcc). variant_name(0, 0, asm_fast). variant_name(0, 1, fast). variant_name(0, 2, reg). variant_name(0, 3, jump). variant_name(0, 4, none). variant_name(0, 5, asm_fast_gc). variant_name(0, 6, fast_gc). variant_name(0, 7, reg_gc). variant_name(0, 8, jump_gc). variant_name(0, 9, none_gc). variant_name(1, 1, seq). variant_name(1, 2, co). variant_name(2, 1, compseq). variant_name(2, 2, compco). variant_name(2, 3, fastseq). variant_name(2, 4, fastco). variant_name(3, 1, none). variant_name(3, 2, anal). variant_name(3, 3, decl). variant_name(3, 4, both). variant_name(4, 1, seq). variant_name(5, 1, seq). variant_name(6, 1, seq). #ifdef WAMCC :- main(_), halt(0). #endif