<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<body><p style="margin-top:0;margin-bottom:0;margin-left:0;margin-right:0;">Dear Café,</p>
<br /><p style="margin-top:0;margin-bottom:0;margin-left:0;margin-right:0;">I've tried to make my code more compact and faster in runtime and I tried to use primitive types, e.g. Int#.</p>
<br /><p style="margin-top:0;margin-bottom:0;margin-left:0;margin-right:0;">To omit all influences, I ended with Ackermann function:</p>
<br /><p style="margin-top:0;margin-bottom:0;margin-left:0;margin-right:0;">acker :: Int# -> Int# -> Int#</p>
<p style="margin-top:0;margin-bottom:0;margin-left:0;margin-right:0;">acker 0# n = n +# 1#</p>
<p style="margin-top:0;margin-bottom:0;margin-left:0;margin-right:0;">acker m 0# = acker (m -# 1#) 1#</p>
<p style="margin-top:0;margin-bottom:0;margin-left:0;margin-right:0;">acker m n = acker (m -# 1#) (acker m (n -# 1#))</p>
<br /><p style="margin-top:0;margin-bottom:0;margin-left:0;margin-right:0;">I was quite surprised, that the result was the same as for function without primitive types when it was compiled with -XStrict option. Both memory and time consumption was the same (small difference under 0.5%). Of course, -O2 option was used. :-)</p>
<p> </p>
<p style="margin-top:0;margin-bottom:0;margin-left:0;margin-right:0;">I compared with the same C implementation:</p>
<p style="margin-top:0;margin-bottom:0;margin-left:0;margin-right:0;">int acker(int m, int n) {</p>
<p style="margin-top:0;margin-bottom:0;margin-left:0;margin-right:0;">    if (m==0) return n+1;</p>
<p style="margin-top:0;margin-bottom:0;margin-left:0;margin-right:0;">    if (n==0) return acker(m-1, 1);</p>
<p style="margin-top:0;margin-bottom:0;margin-left:0;margin-right:0;">    return acker(m-1, acker(m,n-1));</p>
<p style="margin-top:0;margin-bottom:0;margin-left:0;margin-right:0;">}</p>
<p style="margin-top:0;margin-bottom:0;margin-left:0;margin-right:0;"><br />with -O2 option used for gcc, the C code is 7 times faster, for no -O options provided both for ghc and gcc, the C code is also 7 times faster. Thus, no difference.</p>
<br /><p style="margin-top:0;margin-bottom:0;margin-left:0;margin-right:0;">My question is: does the ghc use primitive types automatically when possible? Otherwise, I cannot explain the same times... Or, to my big surprise, using primitives does not save memory and computation time, really?</p>
<br /><p style="margin-top:0;margin-bottom:0;margin-left:0;margin-right:0;">And the other question is about reasoning during translation and code generation, what is the reason the code is so slow? I would guess that forcing primitive types and strict evaluation would produce a code with comparable time to C code... The difference seems to be like the one between compiled code to executable and to low level virtual machine code, which is interpreted then.</p>
<br /><p style="margin-top:0;margin-bottom:0;margin-left:0;margin-right:0;">Versions I used:</p>
<p style="margin-top:0;margin-bottom:0;margin-left:0;margin-right:0;">ghc: 8.10.3</p>
<p style="margin-top:0;margin-bottom:0;margin-left:0;margin-right:0;">gcc: 10.2.0</p>
<br /><p style="margin-top:0;margin-bottom:0;margin-left:0;margin-right:0;">Dušan</p>
<br /><p style="margin-top:0;margin-bottom:0;margin-left:0;margin-right:0;">P.S.</p>
<p style="margin-top:0;margin-bottom:0;margin-left:0;margin-right:0;">I definitely don't want to make someone upset with the content, I'm simply wondering...</p>
<p style="margin-top:0;margin-bottom:0;margin-left:0;margin-right:0;">D.</p>
<p style="margin-top:0;margin-bottom:0;margin-left:0;margin-right:0;"><br /><br /></p>
</body>
</html>