Position of arguments in function definition and performance
José Romildo Malaquias
romildo@uber.com.br
Thu, 7 Feb 2002 08:33:01 -0200
The programs:
-- common part
module Main where
reverse1 [] ys = ys
reverse1 (x:xs) ys = reverse1 xs (x:ys)
reverse2 ys [] = ys
reverse2 ys (x:xs) = reverse2 (x:ys) xs
-- program t1
main = print (length $! reverse1 [1..2000000] [])
-- program t2
main = print (length $! reverse2 [] [1..2000000])
give the following execution times in my 256MB, AMD Athlon XP 1600
based (RedHat Linux 7.2) system running ghc 5.02.2:
EXECUTION TIMES
COMPILER COMPILER OPTIONS t1 t2
ghc 1.503 1.516
ghc -O2 1.858 1.834
ghc -fvia-c 1.507 1.491
ghc -O2 -fvia-c 1.855 1.835
nhc98 3.734 1.559
Comments:
- The compiler option -O2 with ghc leads to slight worse execution time
- Execution times for t1 and t2 are similar with ghc.
- t2 executes aproximately 2.4 times faster than t1 when compiled with nhc98
- t2 executation time when compiled with nh98 is as good as when compiled
with ghc
Conclusions:
- with ghc there is no significant difference in performance when switching
the position of the arguments subject to pattern matching in the function
definition
- with nhc98, it is better to pattern match on the last argument
- surprisingly, the ghc -O2 compiler option generated code is worst than
no optimization
Romildo
--
Prof. José Romildo Malaquias Departamento de Computação
http://iceb.ufop.br/~romildo Universidade Federal de Ouro Preto
romildo@iceb.ufop.br Brasil
romildo@uber.com.br