I compiled the same approximate version to C with gcc optimisations on, and
found the execution time to be roughly comparable between Nim and C. Could
Julia's JIT be doing some sort of optimisation that shortcuts the full code
somehow?
With the Nim version:
import times, math
proc leibniz(terms: int): float =
var res = 0.0
for n in 0..terms:
res += pow(-1.0,float(n))/(2.0*float(n)+1.0)
return 4*res
let t0 = cpuTime()
echo(leibniz(100_000_000))
let t1 = cpuTime()
echo "Elapsed time: ", $(t1 - t0)
I got these output times:
C:projectsNim>nim_version 3.141592663589326 Elapsed time: 6.541
C:projectsNim>nim_version 3.141592663589326 Elapsed time: 6.676
C:projectsNim>nim_version 3.141592663589326 Elapsed time: 6.594
While with the same C version:
#include <stdio.h>
#include <math.h>
#include <time.h>
double leibniz(int terms) {
double res = 0.0;
for (int i = 0; i < terms; ++i) {
res += pow(-1.0, (double)i) / (2.0 * (double)i + 1.0);
}
return 4*res;
}
int main() {
clock_t start = clock();
double x = leibniz(100000000);
printf("%.15f\n", x);
printf("Time elapsed: %f\n", ((double)clock() - start) /
CLOCKS_PER_SEC);
}
The times taken were (EDIT: used -Ofast instead and got faster times):
C:projectsc>c_version 3.141592643589326 Time elapsed: 6.206000
C:projectsc>c_version 3.141592643589326 Time elapsed: 6.204000
C:projectsc>c_version 3.141592643589326 Time elapsed: 6.217000
I realise I actually got a slightly different decimal number with C, but to be
honest I am not a C programmer so I am sure I did something wrong in the
formatting.