Δημοσιεύτηκε: 03 Φεβ 2012, 21:21
από alkismavridis
Λοιπόν έτοιμα τα αποτελέσματα!! Έγραψα ένα πρόγραμμα σε Fortran, C C++ και java που υπολογίζει πόσοι πρώτοι αριθμοί υπάρχουν μέχρι το 20 000 000
Τα έτρεξα από CLI για να μην "ενοχλείται" το pc μου με γραφικό περιβάλλον και μέτρησα (γύρω στις 5 φορές για το κάθε πρόγραμμα) το χρόνο που έκαναν να τελειώσουν.
Σας δίνω τους 4 κώδικες:

1.Fortran
Κώδικας: Επιλογή όλων
PROGRAM SPEEDTEST

PRINT*, 'Give anything and press Ender to start'
READ*,
PRINT*, NUM()

END PROGRAM SPEEDTEST

INTEGER FUNCTION NUM()
INTEGER N,SQ,D,RET
LOGICAL DIV
N=1
RET=1
SQ=0
DO WHILE(N<20000000)

DIV=.FALSE.
N=N+2
IF (MOD(N,2)==0) CYCLE
D=1
SQ= NINT(SQRT(REAL(N)))
DO WHILE(D<=SQ)
D=D+2
IF(MOD(N,D)==0) THEN
DIV=.TRUE.
EXIT
END IF
END DO
IF (.NOT.DIV) RET=RET+1
END DO
NUM = RET
RETURN
END FUNCTION NUM

2. C
Κώδικας: Επιλογή όλων
#include <math.h>
#include<stdio.h>

int num(void);
int N,sq,d;
char ch;
unsigned int div;

int main() {
printf ("Give anything and press Ender to start\n");
scanf("%c", &ch);
printf ("%d\n",num());
return 0;
}//main

int num() {
N=1;
int ret=1;
A: while(N<20000000) {
div=0;
N+=2;
if(N%2==0) continue;
d=1;
sq = (int)sqrt(N);
while(d<=sq) {
d+=2;
if(N%d==0) {
div=1;
break;
}//if
}//while
if(!div) ret++;
}//while
return ret;
}//work


3. C++
Κώδικας: Επιλογή όλων
#include <iostream>
#include <cmath>
using namespace std;

int N,sq,d;
char ch;
bool div;
int num();


int main() {
cout << "Give anything and press Ender to start\n";
cin >> ch;
cout << num()<<endl;
return 0;
}//main

int num() {
N=1;
int ret=1;
A: while(N<20000000) {
div=false;
N+=2;
if(N%2==0) continue;
d=1;
sq = (int)sqrt(N);
while(d<=sq) {
d+=2;
if(N%d==0) {
div=true;
break;
}//if
}//while
if(!div) ret++;
}//while
return ret;
}//work

4. Java
Κώδικας: Επιλογή όλων
import java.util.*;
public class SpeedTest{

static int N,sq,d;
static boolean div;
static Scanner sc = new Scanner(System.in);

public static void main(String[] args) {
System.out.println("Give anything and press Ender to start");
sc.next();
System.out.printf("%d\n",num());
}//main

static int num(){
N=1;
int ret=1;
while(N<20000000) {
div=false;
N+=2;
if(N%2==0) continue;
d=1;
sq = (int)Math.sqrt(N);
while(d<=sq) {
d+=2;
if(N%d==0) {
div=true;
break;
}//if
}//while
if(!div) ret++;
}//while
return ret;
}//num

}//class


Και στις 4 περιπτώσεις όλη η δουλειά γίνεται στη συνάρτηση num() η οποία είναι μεταφρασμένη στις 4 γλώσσες "εντολή προς εντολή" όσο είναι αυτό δυνατόν.
Επίσης να τονίσω ότι τα αποτελέσματα έχουν να κάνουν με την συγκεκριμένη διεργασία και δεν πρέπει να γενικεύονται. Για κάτι άλλο η σειρά μπορεί να είναι άλλη!

Παραθέτω λοιπόν τα εξής ενδιαφέροντα:

Fortran: 36.0 sec (εκτελέσιμο compiled σε gfortran)
C: 37.2 sec (εκτελέσιμο compiled σε gcc)
C++: 39.2 sec (εκτελέσιμο compiled σε g++)
Java: 39.6 sec (class αρχείο compiled σε open-jdk 6)
Java: 42.5 sec (εκτελέσιμο αρχείο compiled σε gcj)
Όλα τα εκτελέσιμα ήταν striped...

Τα συμπεράσματα που εγώ βγάζω είναι τα εξής: Η Fortran παραμένει η γρηγορότερη παρ ότι έρχεται απο την εποχή των σπηλαίων :-)
Η Java ήταν ΠΟΛΥ κοντά στην c++, και μάλλιστα κάποιες μετρήσεις της Java είχαν και μικρότερους χρόνους από κάποιες της c++ (τα παραπάνω είναι μέσες τιμές).
Στην συγκεκριμένη εφαρμογή η c++ αποδείχθηκε γρηγορότερη κατά 1%, άρα είναι τουλάχιστον υπερβολικό να λέμε ότι η Java είναι απελπιστικά αργή (για να μην πω προκατειλημμένο..). ας μην ξεχνάμε άλλωστε ότι ο ρόλος της Java δεν είναι να ψάχνει πρώτους αριθμούς, παρ όλα αυτά στο "εκτός έδρας" παιχνίδι τα πήγε πολύ καλά!
Τέλος το gcj εκτελέσιμο έπασχε σε ταχύτητα (αν και σε άλλες εφαρμογές που το δοκίμασα ήταν και πιο γρήγορο από το class, και σποραδικά ξεπερνούσε και τη c++)...

Τελικό συμπέρασμα είναι το εξής: καμία γλώσσα δεν ήταν και ΤΟΣΟ γρηγορότερη από τις άλλες - διαφορές της τάξςως του 6.5% δεν είναι και τίποτα σπουδαίο.. Άρα ο καθένας ας χρησιμοποιεί τη γλώσσα που τον κάνει να νοιώθει πιο άνετα την ώρα που προγραμματίζει! Εγώ προσωπικά συνεχίζω να ασχολούμαι με την java γιατί ειλικρινά με βολεύει πολύ ο τρόπος που φτιάχνει gui εφαρμογές, και παράλληλα μαθαίνω και άλλες γλώσσες για να διευρύνω τις γνώσεις μου...
Αυτά
:-)