Prev: Is there an Ada compiler whose Ada.Numerics.Generic_Elementary_Functions.Log(Base=>10,X=>variable) is efficient?
Next: Ada-based Primer in Big-Oh Notation
From: (see below) on 15 Feb 2010 13:26 On 15/02/2010 10:58, in article alpine.LNX.2.00.1002151055530.17315(a)Bluewhite64.example.net, "Colin Paul Gloster" <Colin_Paul_Gloster(a)ACM.org> wrote: > Of the two programs shown, the fastest C++ implementation on one test > platform took less than one millisecond and the fastest Ada > implementation took one minute and 31 seconds and 874 milliseconds on > the same platform. Both g++ and gnatmake were from the same > installation of GCC 4.1.2 20080704 (Red Hat 4.1.2-44). Is that 1 millisecond for 1e6 calls? This implies 1ns per call in C++. I find it incredible that a log function could be so fast. I think the loop body must be evaluated at compile-time in C++. On my system your Ada code gives: 6.34086408536266E+08 real 0m33.918s user 0m33.864s sys 0m0.025s And your original C++ code gives: 6.34086e+08 real 0m0.110s user 0m0.003s sys 0m0.003s But if I replace the C++ loop body by: for(int j=1; j<=500; ++j) answer += std::log10(j*0.100000000000000000000); It now gives: 6.34086e+08 real 0m18.112s user 0m18.082s sys 0m0.015s This less than twice as fast as the more generalized Ada code. The simpler inner loop: for(int j=1; j<=500; ++j) answer += j; gives: 1.2525e+11 real 0m0.677s user 0m0.614s sys 0m0.003s So the difference cannot be due to loop overhead. -- Bill Findlay <surname><forename> chez blueyonder.co.uk |