% ---------------------------------------------------------------------------- % % lists.m % Ralph Becket <rbeck@microsoft.com> % Tue Jan 9 13:50:50 GMT 2001 % vim: ts=4 sw=4 et tw=0 wm=0 ff=unix % % NOTE: this is not really a fair test since the Mercury list % library does not implement doubly-linked lists as the C and % (presumably) Python versions do. % ---------------------------------------------------------------------------- % :- module mytest. :- interface. :- import_module io. :- pred main(io__state, io__state). :- mode main(di, uo) is cc_multi. :- implementation. :- import_module string, list, int, require, benchmarking. main --> io__command_line_arguments(ArgV), ( { ArgV = [], Repeats = 1 } ; { ArgV = [Arg], Repeats = string__det_to_int(Arg) } ; { ArgV = [_,_|_], error("usage: nestedloops [Repeats]") } ), { benchmarking__benchmark_det(test_list_ops, 0, N, Repeats, Time) }, io__format("%d\n", [i(N)]). :- func size = int. size = 10000. :- pred test_list_ops(int, int). :- mode test_list_ops(in, out) is det. test_list_ops(_, N) :- L1 = 1 `..` size, % Build [1, 2, ..., size]. copy(L1, L2), % Make a copy. % Do a naive reverse. L3 = list__foldl(func(X, L) = L ++ [X], L2, []), % Now do a weird copy. L4 = list__foldr(func(X, L) = L ++ [X], L3, []), L5 = list__reverse(L1), % Standard reverse. ( if list__det_head(L5) \= size then N = 0 else if L1 \= L2 then N = 0 else N = list__length(L4) ).