[gambit-list] a simple question for optimization
김진우
snifel0 at gmail.com
Fri Apr 10 17:08:08 EDT 2015
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 at HP-Proliant-MicroServer:~/speedtest$ ls*
*pi.cpp pi.scm*
*server at HP-Proliant-MicroServer:~/speedtest$ g++ -o pi-cpp pi.cpp*
*server at HP-Proliant-MicroServer:~/speedtest$ gsc -exe -o pi-scm pi.scm*
*server at HP-Proliant-MicroServer:~/speedtest$ time ./pi-cpp 1000000*
*3.1415926535897643*
*0.038903*
*real 0m0.043s*
*user 0m0.042s*
*sys 0m0.004s*
*server at 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 at 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..
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.iro.umontreal.ca/pipermail/gambit-list/attachments/20150411/ef369962/attachment.htm>
More information about the Gambit-list
mailing list