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..