Hi gambit users
I am trying to verify that a program written in Gambit-C scheme is as fast as equivalent C program.
I tried to make a scheme version of the following C++ program which is;
#include <iostream>
#include <cmath>
#include <cstdio>
#include <ctime>
#include <cstdlib>
#include <iomanip>
using namespace std;
double f(double x);
int main(int argc, char* argv[]) {
clock_t start;
start = clock();
double duration;
double sum = 0;
long n = atoi(argv[1]);
double x;
for(long i = 1; i <= n ;i++) {
x = (i - 0.5) / n;
sum += 4.0/(1.0+x*x);
}
sum /= n;
cout << setprecision(17) << sum << endl << endl;
duration = ( clock() - start ) / (double) CLOCKS_PER_SEC;
cout << duration <<'\n';
return 0;
}
double f(double x) {
return 4.0/(1.0 + x*x);
}
and my best so far is
#!/usr/bin/env gsi-script
(declare
(not safe)
(mostly-flonum))
(define (main arg)
(let ((k (string->number arg)))
(pretty-print (time (cpi (exact->inexact k))))))
(define (cpi n)
(letrec ((rec (lambda (i sum)
(let* ((x (fl/ (fl- i 0.5) n))
(summand (fl/ 4.0 (fl+ 1.0 (fl* x x)))))
(if (fl> i n)
(fl/ sum n)
(rec (fl+ i 1.0) (fl+ sum summand)))))))
(rec 0.0 0.0)))
and the result is poor: 0.043s vs 0.145s
server@HP-Proliant-MicroServer:~/speedtest$ ls
pi.cpp pi.scm
server@HP-Proliant-MicroServer:~/speedtest$ g++ -o pi-cpp pi.cpp
server@HP-Proliant-MicroServer:~/speedtest$ gsc -exe -o pi-scm pi.scm
server@HP-Proliant-MicroServer:~/speedtest$ time ./pi-cpp 1000000
3.1415926535897643
0.038903
real 0m0.043s
user 0m0.042s
sys 0m0.004s
server@HP-Proliant-MicroServer:~/speedtest$ time ./pi-scm 1000000
(time (cpi (exact->inexact k)))
128 ms real time
128 ms cpu time (127 user, 2 system)
182 collections accounting for 67 ms real time (72 user, 1 system)
224000448 bytes allocated
341 minor faults
no major faults
3.1415966535897644
real 0m0.145s
user 0m0.136s
sys 0m0.009s
server@HP-Proliant-MicroServer:~/speedtest$
So.. I guess my scheme version is not equivalent to the original C++ program,
but I'm having trouble figuring out why
any help will be appreciated
any comment, any suggestion..