Το αποτέλεσμα με εξέπληξε, αφού η Java φαίνεται να είναι (αρκετά) ταχύτερη!

GCC version: gcc (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5
Javac version: javac 1.6.0_22
Java version: java version "1.6.0_22"
Java(TM) SE Runtime Environment (build 1.6.0_22-b04)
Java HotSpot(TM) Server VM (build 17.1-b03, mixed mode)
Ρίξτε και εσείς μια ματιά μήπως κάνω κάποιο λάθος (π.χ. στη μέτρηση του χρόνου εκτέλεσης με την clock_gettime):
benchmark.c (compile με gcc -o benchmark.bin benchmark.c -lrt)
- Κώδικας: Επιλογή όλων
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ITERATIVE_N 1000000
#define RECURSIVE_N 35
#define NUM_OF_TESTS 100
long long diff( struct timespec start, struct timespec end) {
/*
* Adapted from code by Guy Rutenberg ( http://www.guyrutenberg.com/2007/09/22/profiling-code-using-clock_gettime/ )
* Creative Commons Attribution-Noncommercial-Share Alike 2.5 Israel License.
*/
struct timespec result;
if ((end.tv_nsec - start.tv_nsec) < 0) {
result.tv_sec = end.tv_sec - start.tv_sec - 1;
result.tv_nsec = 1000000000 + end.tv_nsec - start.tv_nsec;
} else {
result.tv_sec = end.tv_sec - start.tv_sec;
result.tv_nsec = end.tv_nsec - start.tv_nsec;
}
return result.tv_sec*1000000000+result.tv_nsec;
}
long long fibonacciIterative() {
struct timespec tp1;
struct timespec tp2;
clock_gettime(CLOCK_REALTIME, &tp1);
int a = 1;
int b = 1;
int c;
int i;
for (i = 3; i <= ITERATIVE_N; i++) {
c = a + b;
a = b;
b = c;
}
clock_gettime(CLOCK_REALTIME, &tp2);
long nsec = diff(tp1, tp2);
return nsec;
}
int fib(int n) {
if (n <= 2) {
return 1;
} else {
return fib(n - 1) + fib(n - 2);
}
}
long long fibonacciRecursive() {
struct timespec tp1;
struct timespec tp2;
clock_gettime(CLOCK_REALTIME, &tp1);
fib(RECURSIVE_N);
clock_gettime(CLOCK_REALTIME, &tp2);
long nsec = diff(tp1, tp2);
return nsec;
}
int main() {
long long fibonacciIterativeResults[NUM_OF_TESTS];
long long fibonacciRecursiveResults[NUM_OF_TESTS];
int i;
for (i = 0; i < NUM_OF_TESTS; i++) {
long long nsec = fibonacciIterative();
printf("Iterative - Time: %lld nsec\n", nsec);
fibonacciIterativeResults[i] = nsec;
}
printf("\n--------------------------------------------\n\n");
for (i = 0; i < NUM_OF_TESTS; i++) {
long long nsec = fibonacciRecursive();
printf("Recursive - Time: %lld nsec\n", nsec);
fibonacciRecursiveResults[i] = nsec;
}
printf("\n--------------------------------------------\n\n");
FILE *fp = NULL;
fp = fopen("../results/c_results.csv", "w");
if (fp != NULL) {
for (i = 0; i < NUM_OF_TESTS; i++) {
fprintf(fp, "%lld,%lld\n", fibonacciIterativeResults[i], fibonacciRecursiveResults[i]);
}
fclose(fp);
}
return (EXIT_SUCCESS);
}
BenchMark.java
- Κώδικας: Επιλογή όλων
import java.io.*;
class BenchMark{
private static int ITERATIVE_N = 1000000;
private static int RECURSIVE_N = 35;
private static int NUM_OF_TESTS = 100;
private static long fibonacciIterative(){
long tp1;
long tp2;
tp1 = System.nanoTime();
int a = 1;
int b = 1;
int c;
int i;
for (i = 3; i <= ITERATIVE_N; i++) {
c = a + b;
a = b;
b = c;
}
tp2 = System.nanoTime();
long nsec = tp2 - tp1;
return nsec;
}
private static int fib(int n) {
if (n <= 2) {
return 1;
} else {
return fib(n - 1) + fib(n - 2);
}
}
private static long fibonacciRecursive(){
long tp1;
long tp2;
tp1 = System.nanoTime();
fib(RECURSIVE_N);
tp2 = System.nanoTime();
long nsec = tp2 - tp1;
return nsec;
}
public static void main(String[] args){
long fibonacciIterativeResults[] = new long[NUM_OF_TESTS];
long fibonacciRecursiveResults[] = new long[NUM_OF_TESTS];
int i = 0;
for (i=0; i<NUM_OF_TESTS; i++){
long nsec = fibonacciIterative();
System.out.printf("Time: %1$d nsec\n", nsec);
fibonacciIterativeResults[i] = nsec;
}
System.out.println("\n--------------------------------------------\n");
for (i=0; i<NUM_OF_TESTS; i++){
long nsec = fibonacciRecursive();
System.out.printf("Time: %1$d nsec\n", nsec);
fibonacciRecursiveResults[i] = nsec;
}
System.out.println("\n--------------------------------------------\n");
try{
PrintWriter w = new PrintWriter("../results/java_results.csv");
for (i=0; i<NUM_OF_TESTS; i++){
w.format("%1$d,%2$d\n", fibonacciIterativeResults[i], fibonacciRecursiveResults[i]);
}
w.flush();
w.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
Αποτελέσματα:
c_results.csv
- Κώδικας: Επιλογή όλων
10055958,155399487
9168869,155949301
6019655,152684535
6900462,151313622
6027148,149167462
6037679,151462015
6014337,151951852
6014339,152259303
6034115,149230276
6042590,151250208
6018276,149067203
6019156,156469463
6014902,152895369
6035189,152043486
6038458,153412931
6016687,151830978
6014593,151831242
6017137,151603582
6033583,150970514
6094451,151666628
6020053,150875492
6016282,150617024
6021636,151723461
6034869,151157623
6034570,151642391
6015646,151975778
6014115,152756594
6022742,155436980
6037780,156123739
6041057,156164268
6013517,154174125
6013766,150574272
6023068,154725452
6035122,153192698
6033339,151894192
6015496,153207008
6019618,154065619
6025175,153097306
6035560,155451296
6037055,154531950
6015102,153103987
6014420,156462504
6025674,155050330
6033358,155585595
6033040,155638593
6093570,150998896
6010931,172606963
6031159,153219333
6025437,152288191
6041800,156867834
6010596,154974526
6019082,152050127
6024917,153697207
6036565,154540255
6029448,155980327
6019427,154812585
6011145,152491272
6037375,151280795
6029448,154478639
6029044,151538496
6011819,152551556
6018067,152878476
6024168,151474569
6044805,153513752
6022836,153777787
6019183,152170356
6010351,151209515
6038974,151752595
6034948,155371459
6023438,152561583
6010096,151388488
6022613,150775438
6023967,150917393
6054307,151568226
6011651,151720834
6018992,150748712
6010990,151929022
6037225,152051468
6036884,154286261
6025823,151706653
6021526,151455387
6017537,152934065
6023297,153605611
6055100,151688557
6011871,152072115
6019113,153580355
6010256,155736122
6038348,156426390
6036234,155502597
6021457,153782623
6015117,149693908
6017901,150161477
6023863,148972581
6053017,153365160
6012226,153533216
6020290,150594316
6010371,151840020
6038666,151377558
6036388,149457793
6020542,152059533
java_results.csv
- Κώδικας: Επιλογή όλων
6758807,77269213
39035,66649104
37855,66569468
37665,66570614
37620,66590916
37755,66560009
37790,66553813
505,66547716
470,66567733
505,66571265
465,66597252
465,66547625
480,66537435
505,66533865
480,66560419
475,66528308
480,66622786
510,66573094
485,66527203
480,66549572
486,66581811
510,66538412
480,66533100
480,66536705
481,66640047
515,66607354
485,66599078
485,66740058
480,66685647
510,66559687
550,66582797
485,66612923
485,66882805
510,66696121
490,66678116
480,66625439
490,66637243
485,66538836
485,66904702
480,67770411
480,66713930
520,66549539
485,66546135
485,66554324
480,66540774
520,66527923
485,66607545
485,66525370
480,66600457
495,68731762
485,67116308
485,67006712
485,66818042
490,66821615
480,66558680
485,66420975
485,66535676
515,66573534
480,66625796
480,66556383
485,66480903
515,67050246
515,66992756
480,67139677
480,66748818
490,66473384
515,66424557
540,66404317
480,66446408
490,66446809
480,66431729
480,66399290
485,66400790
515,66921676
480,66416045
486,66435712
485,66568767
515,66434153
485,66418182
515,66434795
485,66454762
525,66425641
485,66434676
485,66442304
485,66464572
515,66461462
510,66562568
480,66702145
480,66533849
510,66512167
485,66542312
485,66544225
485,66497348
515,68013518
485,74004072
485,71152562
485,67367776
510,67224554
480,67433364
485,66923543