Basic benchmark
bearophile
bearophileHUGS at lycos.com
Sat Dec 13 07:21:53 PST 2008
I have adapted another small benchmark to D. This benchmark is less interesting than the other ones because it mostly tests the optimizations done by the back-end. This means it's not a problem of the D language or its front-end, so even if DMD here shows to be not much efficient, LDC once finished may show significant improvements.
As usual I may have done several errors, so keep your eyes open.
D code:
/*
original code copyright 2004 Christopher W. Cowell-Shah
http://www.cowell-shah.com/research/benchmark/code
other code portions copyright
http://dada.perl.it/shootout/
and Doug Bagley
http://www.bagley.org/~doug/shootout
combined, modified and fixed by Thomas Bruckschlegel - http://www.tommti-systems.com
*/
import std.c.stdio: printf;
import std.c.time: clock, CLOCKS_PER_SEC, clock_t;
void longArithmetic(long longMin, long longMax) {
clock_t startTime = clock();
long longResult = longMin;
long i = longMin;
while (i < longMax) {
longResult -= i++;
longResult += i++;
longResult *= i++;
longResult /= i++;
}
clock_t stopTime = clock();
double elapsedTime = (stopTime - startTime) / (CLOCKS_PER_SEC / 1000.0);
printf("Long arithmetic elapsed time: %1.0f ms with longMax %ld\n", elapsedTime, longMax);
printf(" i: %ld\n", i);
printf(" longResult: %ld\n", longResult);
}
void nested_loops(int n) {
clock_t startTime = clock();
int a, b, c, d, e, f;
int x=0;
for (a=0; a<n; a++)
for (b=0; b<n; b++)
for (c=0; c<n; c++)
for (d=0; d<n; d++)
for (e=0; e<n; e++)
for (f=0; f<n; f++)
x+=a+b+c+d+e+f;
clock_t stopTime = clock();
double elapsedTime = (stopTime - startTime) / (CLOCKS_PER_SEC / 1000.0);
printf("Nested Loop elapsed time: %1.0f ms %d\n", elapsedTime, x);
}
int main() {
long longMin = 10_000_000_000L;
long longMax = 11_000_000_000L;
longArithmetic(longMin, longMax);
nested_loops(40);
return 0;
}
------------------------
C code, almost the same (you may need to change LL_FORMAT to make it run correctly):
/*
original code copyright 2004 Christopher W. Cowell-Shah
http://www.cowell-shah.com/research/benchmark/code
other code portions copyright
http://dada.perl.it/shootout/
and Doug Bagley
http://www.bagley.org/~doug/shootout
combined, modified and fixed by Thomas Bruckschlegel - http://www.tommti-systems.com
*/
#include "time.h"
#include "stdio.h"
// accopding to your compiler
#define LL_FORMAT "%I64d"
//#define LL_FORMAT "%ld"
void longArithmetic(long long longMin, long long longMax) {
clock_t startTime = clock();
long long longResult = longMin;
long long i = longMin;
while (i < longMax) {
longResult -= i++;
longResult += i++;
longResult *= i++;
longResult /= i++;
}
clock_t stopTime = clock();
double elapsedTime = (stopTime - startTime) / (CLOCKS_PER_SEC / 1000.0);
printf("Long arithmetic elapsed time: %1.0f ms with longMax "LL_FORMAT"\n", elapsedTime, longMax);
printf(" i: "LL_FORMAT"\n", i);
printf(" longResult: "LL_FORMAT"\n", longResult);
}
void nested_loops(int n) {
clock_t startTime = clock();
int a, b, c, d, e, f;
int x=0;
for (a=0; a<n; a++)
for (b=0; b<n; b++)
for (c=0; c<n; c++)
for (d=0; d<n; d++)
for (e=0; e<n; e++)
for (f=0; f<n; f++)
x+=a+b+c+d+e+f;
clock_t stopTime = clock();
double elapsedTime = (stopTime - startTime) / (CLOCKS_PER_SEC / 1000.0);
printf("Nested Loop elapsed time: %1.0f ms %d\n", elapsedTime, x);
}
int main() {
long long longMin = 10000000000LL;
long long longMax = 11000000000LL;
longArithmetic(longMin, longMax);
nested_loops(40);
return 0;
}
-------------------
I have compiled it with GCC and DMD with:
gcc version 4.2.1-dw2 (mingw32-2)
-O3 -s
DMD v1.037
-O -release -inline
---------------------
Timings:
C gcc:
Long arithmetic: 11.15 s
Nested Loops: 0.11 s
D dmd:
Long arithmetic: 63.7 s
Nested Loops: 6.17 s
Bye,
bearophile
More information about the Digitalmars-d
mailing list