jhc vs ghc and the surprising result involving ghc generated
fw at deneb.enyo.de
Tue Nov 1 13:03:24 EST 2005
* > On Tue, 2005-11-01 at 17:30 +0100, Florian Weimer wrote:
>> > use C control constructs rather than gotos.
>> With GCC version 4, this will have no effect because the gimplifier
>> converts everything to goto-style anyway.
> Felix generates C with gotos. The result is FASTER
> than native C using gcc 4.0 on x86_64.
> Felix generated C(++) code -- compiled with same options:
> int FLX_REGPARM _i1860_f1301_ack(
> int _i1864_v1303_x, int _i1865_v1304_y)
> _us2 _i1867_v1799_ack_mv_74;
> _us2 _i1868_v1821_ack_mv_84;
_us2 is unsigned, correct?
BTW, you shouldn't generate identifiers with leading underscores
because they are reserved for the implementation.
> I have no real idea why the Felix generated C is faster.
> Two guesses:
> (a) the two 'mv' variables declared at the top are optimised
> away, so the Felix version is only using 3 words of stack.
> (b) the "parallel assigment in tail calls optimisation"
> is saving one word on the stack (evaluating y before x
> saves a temporary across the non-tail recursion).
Both variants do not use the stack.
It seems that the goto-based version leads to different static branch
prediction results, which happen to be favorable. If you want, try
adding __builtin_expect to the if statement in both versions, and
More information about the Glasgow-haskell-users