Consider the following Haskell-definitions (maybe you recognize it =>
"Is efficient backtracking feasible in functional languages?"):

strangesucc :: Int -> Int
strangesucc n = head [x | x <- [0..], x > n]


Evaluating main = print (strangesucc n)
we obtain the following table:

n      | GCs | alloc    | user | mx   | id     
-------+-----+----------+------+------+-------
100000 | 30  |  6001368 | 1.25 |  240 |  29927   overloaded 
200000 | 61  | 12001368 | 2.42 |  242 |  59174 

100000 |  3  |  2401236 | 0.81 | 1189 |  72767   non-overloaded
200000 |  3  |  4801236 | 1.29 | 1762 | 173179 


Comparing the overloaded with the non-overloaded
definition we obtain:

                 | overloaded | non-overloaded
-----------------+------------+---------------
 1) GCs          | high       | low
    depends on n | yes        | no
 2) alloc        | high       | low
 3) user         | high       | low
 4) mx           | low        | high
    depends on n | no         | yes
 5) id           | low        | high


My questions:

1. Why do the two functions (with and without
   type signature) show opposite behaviour?

2. Why do alloc and mx/id show opposite behaviour?


Marc Rehmsmeier.

-------------------------------------------------------------

GCs   = number of garbage-collections (STAT-file)
alloc = bytes allocated from heap (STAT-file)
user  = user time used (rusage)
mx    = maximum resident set size (rusage)
id    = integral resident set size (rusage)

Reply via email to