[Template-haskell] On reifing functions and partial evaluation

Duncan Coutts duncan at coutts.uklinux.net
Tue Feb 17 19:12:32 EST 2004


On Tue, 2004-02-17 at 09:05, Alastair Reid wrote:
> > First the sensational headline:
> > ghc beats gcc by 57% on Ackerman benchmark, improved to 290% using
> > Template Haskell.
> 
> Any thoughts on how it would compare with a C++ template-based version of ack?  
> Off the top of my head, I'd say performance ought to drop back to nearer the 
> 57% better mark but it'd be (mildly) interesting to confirm this.

Ok, so to be fair to C/C++ (!) we should really compare like with like
in which case we should compare our template-unrolled version with a C++
template unrolled version.

As you thought, the performance drops back, but we still win. :-)
75 sec for g++-3.3.2 -O3 -fomit-frame-pointer
40 sec for genex_ack_4 with ghc -O

So the percent improvement that the marketing folk would put in their
adds would be 87%. So actually we're winning by a greater margin than
before.

If you're really keen we can get the time down even further:
88 sec for       ack_4 with ghc -O2 -fvia-C -optc-O2 (vs 100sec for ghc -O)
32 sec for genex_ack_4 with ghc -O2 -fvia-C -optc-O2 (vs 40sec  for ghc -O)

Duncan



Here's the C++ code:

template<int m>
class foo {
  public:
  
  static int ack(int n) {
    if (n==0) return foo<m-1>::ack(1);
    else      return foo<m-1>::ack(ack(n-1));
  }
};

template<>
class foo<0> {
    public:
    static int ack(int n) {
    return n+1;
  }
};

int main (int argc, char *argv[]) {
  int n = ((argc == 2) ? atoi(argv[1]) : 1);
  
  printf("ack 4 %d  = %d\n", n, foo<4>::ack(n));
  
  return 0;
}



More information about the template-haskell mailing list