bhjghjh - 1 year ago 57

Bash Question

I wish to calculate runtime of my program which approximates PI using Monte Carlo Method. I have written a unix shell script which feeds the program No of points, N = 10^{k} , for K = 1,2, ...7.

Now I wish to find the execution time for Each N in Unix program time. My unix shell script looks as follows:

`#!/bin/bash`

k=1

N=10

while [[ k -le 7 ]]

do

echo "$k N" | ./pi $N

((k = k + 1))

((N = N * 10))

done

Now when I type:

`$ time ./pi.sh`

`10 3.6 0.1459155902616465`

100 3.08 0.01960555055392467

1000 3.104 0.01196611328551369

10000 3.1284 0.004199352062629202

100000 3.1432 0.0005116342528909465

1000000 3.139704 0.0006011771092076384

10000000 3.141432 5.113762588206346e-05

real 0m0.583s

user 0m0.560s

sys 0m0.012s

I was wondering if I have to write a bash script to get execution time for Each N input or I have to do something in my code. I am also sharing the code I used to generate data:

`/*`

Program to compute Pi using Monte Carlo methods,

takes bash input from shell to feed No of points

compile using:

$ g++ -o pi monte_pi.cpp

$ chmod 755 pi.sh

$ ./pi.sh

*/

#include <iostream>

#include <iomanip>

#include <cmath>

#include <cstdlib>

#include <ctime>

#include <stdio.h>

#include <string.h>

#include <math.h>

#include <stdlib.h>

using namespace std;

int main(int argc, char **argv)

{

double x,y,z,approx_PI, rel_err;

double a, b;

int i, NpointsInside=0;

const double pi = 3.14159265358979323846;

// set right and left edge of the circumscribing square

a = -1.0;

b = 1.0;

// convert command-line input to N = number of points

int N = atoi( argv[1] );

// initial seed value (use system time)

srand(time(NULL));

cout.precision(16);

for(i=1; i<=N; i++)

{

// generate random numbers between left and right edges

x = a + static_cast <double> (rand()) /( static_cast <double> (RAND_MAX/(b-a)));

y = a + static_cast <double> (rand()) /( static_cast <double> (RAND_MAX/(b-a)));

z = x*x + y*y;

if(z<=1.0)

NpointsInside++;

}

//check if there is absolutely no points inside circle

if (NpointsInside==0)

{

printf("No points inside circle, Increase npoints\n");

exit(0);

}

approx_PI = 4*double(NpointsInside)/double(N);

//estimate relative error

rel_err = fabs(pi-approx_PI)/fabs(pi);

cout << setw(10) << N << setw(20) << approx_PI << setw(30) << rel_err <<endl;

return 0;

}

Answer Source

By writing `$ time ./pi.sh`

you are measuring time needed to execute pi.sh, which has a loop in it. So you measure total time for all iterations. If you want to measure every iteration independently, you have to put `time`

in invocation of the iteration:

```
echo "$k N" | time ./pi $N
```