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