Προς το περιεχόμενο

C, VB, Java, PHP, MATLAB in the ring of performance


GothicCrusader

Προτεινόμενες αναρτήσεις

Δημοσ.

Πολλοί σε προηγούμενο thread αναφέρανε αρκετές φορές ότι το επιχείρημα ότι η java υστερεί σε επιδόσεις δεν ευσταθεί βασιζόμενοι στο ότι η διαφορά ταχύτητας είναι αμελητέα. Μου δημιουργήθηκαν λοιπόν κάποια ερωτηματικά. Η απορία μου δεν ήταν τόσο το εάν ή όχι στα συγκεκριμένα projects που μελετάω η Java θα είναι πιο αργή. Η απορία μου ήταν περισσότερο το πόσο πιο αργή θα είναι. Είναι η διαφορά μικρή ή είναι μεγάλη; Άρα είναι σωστό να κατηγορώ την Java για την ταχύτητά της ή όχι;

 

Σαββατοκύριακο λοιπόν και μάλιστα μέσα Αυγούστου. Δεν βαριέσαι λέω, ας το κάνουμε για το χαβαλέ. Πόσο θα μου πάρει; 10 λεπτά; 20; Δεν είναι πολύ. Μέσα σε 30 λεπτάκια τα προγράμματα ήταν έτοιμα. Σκοπός 2 δισεκατομμύρια επαναλήψεις σε ένα πολύ απλό loop.

 

Το πρώτο που θέλω να πω είναι ότι το loop που χρησιμοποίησα δεν είναι κάτι που προέρχεται από ένα φανταστικό κόσμο εξωγήινων που θέλουν να ταλαιπωρούν τους υπολογιστές τους με δισεκατομμύρια πράξεις χωρίς κανένα λόγο αλλά από ένα φυσικό κόσμο που η παραγωγή πολλών τυχαίων αριθμών έχει πολύ μεγάλη σημασία για τη προσομοίωση φαινομένων. Δεν θα μπω σε λεπτομέρειες γιατί δεν είναι αυτό το θέμα μου στο συγκεκριμένο post. Όποιος θέλει κάτι παραπάνω φυσικά μπορεί να ρωτήσει.

 

Το δεύτερο που θέλω να πω είναι ότι το pc έτρεχε και άλλες processes και άρα θεωρητικά κάποιες από αυτές μπορεί να επιβραδύνουν περισσότερο τη μία γλώσσα (π.χ. την Java) από την άλλη (π.χ. τη C). Ωστόσο δεν πολυασχολήθηκα με τις τέλειες συνθήκες εκτέλεσης μιας και απλά ήθελα να πάρω μία ιδέα των αριθμών που θα προκύψουν.

 

Πάμε λοιπόν..

 

 

Αρχικά δίνω τον κώδικα των loops για να φαίνεται ο τρόπος που μέτρησα τον χρόνο. Όποιος θέλει μπορεί να προτείνει διορθώσεις εφόσον βελτιώνουν την ταχύτητα ή φυσικά να πάρει τις μετρήσεις ο ίδιος. Όλες οι μεταβλητές, ό,που δηλώνονται, δηλώνονται ως double.

 

Ας δούμε λοιπόν το βρόχο σε C++ (MSVC 6.0):

 

>
time( &start );
while (i++ < N) {
	x = (double)rand()*max/RAND_MAX;
	y = (double)rand()*max/RAND_MAX;
	if ( x*x+y*y < 1)
		sum++;
}
time( &stop );

 

 

Ας δούμε τον βρόχο σε VB:

 

 

>
   start_time = Timer
   While (i < N)
       x = Rnd
       y = Rnd
       If x * x + y * y < 1 Then sum = sum + 1
       i = i + 1
   Wend
   stop_time = Timer 

 

Ο βρόχος σε MATLAB:

 

>
tic
while (i<iter)
   x=rand;
   y=rand;
   if x*x +y*y < 1
       sum = sum + 1;
   end
   i = i + 1;
end
toc

 

 

Ο βρόχος σε JAVA (JDK 1.5):

 

>
	long start = System.currentTimeMillis();
	while (i++ < N) {
		x = fudus.nextDouble(); // δοκίμασα και nextInt
		y = fudus.nextDouble();
		if (x*x + y*y < 1)
			sum++;
	}
	long elapsedTimeMillis = System.currentTimeMillis()-start;
	float elapsedTimeSec = elapsedTimeMillis/1000F; 

 

Και τέλος ο βρόχος σε PHP:

 

>
$tic = time();
while ($i++ < $N) {
	$x = mt_rand(0,9)/10;
	$y = mt_rand(0,9)/10;
	if ( ($x*$x + $y*$y) < 1)
		$sum++;
}
$toc = time()-$tic;

 

 

Και τα περιβόητα αποτελέσματα σε CPU 2,4, 512 RAM, WinXP SP2 και με διάφορες processes από πίσω. Πήρα:

 

>
C	[b]84[/b] s
MATLAB	[b]348 [/b]s
JAVA	[b]784 [/b]s
VB	[b]1002 [/b]s
PHP	[b]23958[/b] s

 

 

Μάλιστα ...

 

Πρώτο πολύ σαφές, οι interpreted languages δεν είναι για μαθηματικά. Αναμενόμενο όμως και η PHP χρησιμοποιήθηκε μόνο για λόγους πληρότητας.

 

Δεύτερο σαφές, το MATLAB είχε μισή ταχύτητα από τη Java. Δεν το περίμενα.

 

Αν κάνουμε τώρα και τη διαίρεση για λεπτά σε C και Java παίρνουμε ότι η C τελείωσε σε ενάμιση λεπτό και η Java σε 13... Η σχετική διαφορά ταχύτητας στο συγκεκριμένο πρόβλημα μας βγήκε 784/84 = 9,33. Δηλαδή πόσο πιο αργά εκτέλεσε η Java το loop; «8,5 φορές» πιο αργά στρογγυλεύοντας υπέρ της Java.

 

Μάλιστα... Και τα μισά να της χαρίσω λόγω σφαλμάτων πάμε στο «4 με 5 φορές πιο αργά». Μάλιστα.

 

...

 

Τέλος πάντων, για να είμαι καλυμμένος:

 

α) Αν κάποιος μπορεί να βελτιώσει το βρόχο της Java φυσικά ας το κάνει. Εγώ δοκίμασα και nextDouble και nextInt και μάλιστα το ένα εκ των δύο ήταν για κλάματα. Ο αριθμός 784 αντιστοιχεί στο πιο γρήγορο αλλά για να είμαι ειλικρινής δεν θυμάμαι ποιο από τα δύο ήταν το πιο γρήγορο.

 

β) Η σύγκριση δεν είναι για να αποδείξει ότι η Java είναι πιο αργή από τη C (ναι κάθε γλώσσα για διαφορετικό σκοπό μπλα μπλα μπλα), αλλά να αποδείξει ότι η διαφορά ταχύτητας της Java από τη C δεν είναι ένα ουτοπικό επιχείρημα, αλλά είναι ουσιαστικό πρόβλημα και ένας καθοριστικός παράγοντας τουλάχιστο στις υπολογιστικές επιστήμες που απαιτούν τυχαίους αριθμούς.

 

γ) Έχω βγάλει print screens από όλα τα αποτελέσματα αλλά ειλικρινά δεν θα τα ανεβάσω κάπου τώρα, όποιος θέλει τα ζητά.

 

δ) Οι αριθμοί μπορεί να διαφέρουν ανάλογα με τη cpu, αυτό που έχει σημασία είναι η σχέση τους. Επίσης στο συγκεκριμένο πρόβλημα η σχέση τους είναι ανεξάρτητη από τον αριθμό των επαναλήψεων που σημαίνει ότι αν η C είναι Χ φορές πιο γρήγορη από τη Java σε Ν επαναλήψεις, τότε είναι πάλι Χ φορές πιο γρήγορη από τη Java για οποιοδήποτε αριθμό επαναλήψεων. Αυτό μπορείτε να το αποδείξετε μόνοι σας πειραματικά.

 

 

Αυτά.

 

Οποιαδήποτε διόρθωση καλοδεχούμενη

  • Απαντ. 33
  • Δημ.
  • Τελ. απάντηση
Δημοσ.

Για να πάρεις πιο ακριβή αποτελέσματα μπορείς να αλλάξεις την priority της process σου σε real-time. Αυτό μπορείς να το κάνεις στην C++ και μάλλον και στην Java για τις άλλες αμφιβάλω.

 

Σε C πρέπει να χρησιμοποιήσεις το API. Για τα Windows ο κώδικας είναι:

 

>HANDLE hThread= GetCurrentThread();
HANDLE hProcess= GetCurrentProcess();
SetThreadPriority(hThread, THREAD_PRIORITY_TIME_CRITICAL);
SetPriorityClass(hProcess, REALTIME_PRIORITY_CLASS);

 

Για Java δεν έχω ιδέα.

Δημοσ.

metaksi allon, exei simasia to pos einai implemented i rand() sti vc++ kai i fudus.nextDouble() sti java...

 

giati den ekanes kati poli pio aplo kai "antikeimeniko" mesa stis loopes, opos px:

>
while (i++ < N) {
	x = y-x;
	y = x*y;
	if ( x*x+y*y < 1)
		sum++;
}

kai gia tis 2 glosses...

 

alla kai pali exo tin entiposi oti tha eksetaseis tin taxitita ektelesis tou sigekrimenou while loop kai oxi kati genikotero kai antikeimenikotero....

Δημοσ.

Μάλιστα.. μπορείς να μου πεις ποιο ειναι το αποτελεσμα αυτου του test Gothic;

Ναι θα μου απαντησεις η C ειναι πιο γρηγορη απο την Java κατα Χ φορες!

Σωστα..αλλά εν μερη! Ειναι πιο γρηγορη στην εκτελεση αυτου του loop ..οπως ειπαν και παραπανω! Μόνο Αυτό και τιποτα άλλο!

 

Οσο αναφορα την ιδια την υλοποιηση μπαζει..πολυ...

γιατι εσκεμενα ή οχι (μπορει αν το εκανες κατα τυχη) μου καλεις 2 φορες την μηχανη τυχαιων αριθμων της Java Random.NextDouble() για την οποια δεν ξερουμε καν με ποιες συνθηκες υλοποιειται..και αν ειανι δικαιο στην αντιστοιχη C υλοποιηση...

δεν μου λες..αν τρεχεις το VM με καποιο συγκεκριμενο flag..αν θελω την πληρη...ταχυτητα και να πιεσω την Java application μου σε σημεια υπερβολης υπαρχουν διαθεσιμα flαg που μπορω...να πιεσω την εικονικη μηχανη να τρεξει υπο συγκεκριμενες συνθηκες! και αλλα πολλά!

 

αυτές οι παρατηρήσεις ...νομιζω δικαιολογουντε γιατι μια μιλαμε για γλωσσα που μιλαει κατευθειαν στο λειτουργικο..και καλει..πραγματα απο τα εγκατα..και η αλλη χρησιμοποιει διαφορα layer μεχρι να φτασει να καλεσει πολυ εσωτερικα πραγματα!

 

θα ηθελα να δω...την εκτελεση σε κατι ποιο απλο...που δεν θα καλω την Random μηχανη..οχι οτι και παλι..η C δεν θα ηταν γρηγοροτερη..αλλα βλεπουμε ηδη οτι η Java ειναι πολυ πιο γρηγορη απο μια γλωσσα οπως η VB..που για οσους ξερουν..ο κωδικας της απο πισω..ειναι Visual C compiler απο πισω ...(απο τα μυστικα της MS χεχεχε).

 

Η ουσία ειναι οτι η Java ειναι αρκετα...δυνατη να εκτελεσει ολα εκεινα που κανει ολος ο κοσμος..και μαλιστα με ταχυτητα..επισης...μπορει τις πιο πολλες φορες..να εχει καλυτερη διαχειριση..μνημης αλλα και multithreading issues (ακομα και απο εναν ...κακο προγραμματιστη) σε αντιθεση με C. C++ που δεν βοηθουν καθολου!

 

Αν μονο με ενα τεστ loop που το αποτελεσμα το ξεραμε απο πριν ..εχεις πιστει..για το ποσο κακη ειναι η Java..κοιτας το δεντρο και εχεις χασει το δασος!

 

την MATLAB τι μου την εβαλες στο τεστ... ειναι αρκετα ειδικευμενο εργαλειο για συγκεκριμενα πραγματα...δεν θα μπορουσα ποτε να βγαλω συμπερασματα για τα αποτελεσματα της...

πχ...αν μου εκανες μια συγκριση για ΜΑΤLAB και Fortrant που ειναι γνωστη για την δυναμη της στους μαθηματικους υπολογισμους..θα το καταλαβαινα!

 

καποιος ειχει γραψει σε καποιο forum πολυ σωστο

The decision to use C++ or Java will never be made on the basis of speed alone.

Δημοσ.

Και μια παρατηρησει που καποιος φιλος..μου εκανε γνωστο

το MATLAB παιζει ουσιαστικα με Java (ερχεται με το δικο του Virtual Machine)

Δημοσ.

Βασικά εγώ μία ερώτηση έχω.

Ποιος ο λόγος του test και γιατί κάποιος να βασιστεί σε αυτό για να δει αν η Java ή η C++ είναι πιο γρήγορη και να μη βρει τα τόσα journals που έχουν γραφτεί επί του θέματος τα οποία είναι και επιστημονικά αποδεδειγμένα;

 

Με ένα πρόχειρο google search

Computer Graphics and Immersive Technology Lab, University of Southern California

Δημοσ.

Δεν υπάρχει ιδιαίτερος λόγος. Όλα μπορούμε να τα βρούμε στο google.

 

Απλά όταν είναι εύκολο να δοκιμάσεις κάτι μόνο σου γιατί να μην το κάνεις;

 

-edit-

 

Εξάλλου το πρόβλημα είναι ότι στο Ίντερνετ υπάρχουν τόσες έρευνες που μπορείς εύκολα να αποδείξεις και μία θέση και τη άλλη.

Δημοσ.

Οσο αναφορα την ιδια την υλοποιηση μπαζει..πολυ...

γιατι εσκεμενα ή οχι (μπορει αν το εκανες κατα τυχη) μου καλεις 2 φορες την μηχανη τυχαιων αριθμων της Java Random.NextDouble() για την οποια δεν ξερουμε καν με ποιες συνθηκες υλοποιειται..και αν ειανι δικαιο στην αντιστοιχη C υλοποιηση...

 

Δεν καταλαβαίνω τι εννοείς για το .double. Σε όλες τις γλώσσες καλώ δύο φορές την random γιατί ο σκοπός μου είναι να δοκιμάσω την παραγωγή τυχαίων αριθμών στις δύο γλώσσες για να δω κατά πόσο είναι αξιόπιστες για μέθοδο Monte Carlo και για επίλυση προβλήματων στοχαστικής ολοκλήρωσης.

 

Σκοπός είναι να αποδείξω ότι η πρόταση:

 

The decision to use C++ or Java will never be made on the basis of speed alone

 

που αναφέρθηκε πολλές φορές ως επιχείρημα είναι και αυτή ειδική και όχι γενική. Υπάρχουν περιπτώσεις που δεν ισχύει. Η στοχαστική ολοκλήρωση είναι μία από αυτές κατά τη γνώμη μου.

 

δεν μου λες..αν τρεχεις το VM με καποιο συγκεκριμενο flag..αν θελω την πληρη...ταχυτητα και να πιεσω την Java application μου σε σημεια υπερβολης υπαρχουν διαθεσιμα flαg που μπορω...να πιεσω την εικονικη μηχανη να τρεξει υπο συγκεκριμενες συνθηκες! και αλλα πολλά!

 

Όχι δεν χρησιμοποιώ κανένα συγκεκριμένο flag. Οποιαδήποτε πρόταση για τη βελτίωση ταχύτητας της Java δεκτή. Είναι μία πρόκληση να δούμε πόσο καλύτερη ταχύτητα μπορούμε να πάρουμε.

 

Η ουσία ειναι οτι η Java ειναι αρκετα...δυνατη να εκτελεσει ολα εκεινα που κανει ολος ο κοσμος..και μαλιστα με ταχυτητα..επισης...μπορει τις πιο πολλες φορες..να εχει καλυτερη διαχειριση..μνημης αλλα και multithreading issues (ακομα και απο εναν ...κακο προγραμματιστη) σε αντιθεση με C. C++ που δεν βοηθουν καθολου!

 

agreed

 

την MATLAB τι μου την εβαλες στο τεστ... ειναι αρκετα ειδικευμενο εργαλειο για συγκεκριμενα πραγματα...!

 

Η MATLAB και το mathematica είναι τα πρώτα εργαλεία που χρησιμοποιείς για να δοκιμάσεις την αξιοπιστία των αποτελεσμάτων σου σε μεγάλα loops που χρησιμοποιούνται στις υπολογιστικές επιστήμες. Το παραπάνω loop είναι φυσικά το πιο απλό παράδειγμα χρήσης τυχαίων αριθμών. Στην πραγματικότητα τα loops είναι πολύ πιο σύνθετα οπότε η επαλήθευση είναι αναγκαία. Επομένως το MATLAB είναι πάντα μέτρο σύγκρισης. Αν δεν μπορώ να επαληθεύσω το αποτέλεσμα (δηλαδή δεν παίρνω ρεαλιστικές ταχύτητες στο MATLAB) τότε είτε έχω γράψει τον κώδικα σε C είτε σε Java, ο κώδικας είναι άχρηστος.

Δημοσ.

alla kai pali exo tin entiposi oti tha eksetaseis tin taxitita ektelesis tou sigekrimenou while loop kai oxi kati genikotero kai antikeimenikotero....

 

Στο παραπάνω πρόβλημα εξετάζω κάτι γενικότερο και «αντικειμενικότερο» από το συγκεκριμένο while loop. Εξετάζω όλο τον κλάδο προβλημάτων που χρησιμοποιούν τις μεθόδους της στοχαστικής ολοκλήρωσης και τις μεθόδους Monte Carlo είτε για υπολογισμό μεγεθών είτε για συστήματα προσομοίωσης.

 

Το παραπάνω Loop είναι η πιο απλή περίπτωση στοχαστικής ολοκλήρωσης και αποτελεί τη βάση για οποιοδήποτε άλλο πρόβλημα. Οποιοδήποτε άλλο πρόβλημα χτίζεται γύρω από αυτό και για να υλοποιηθεί χρειάζεται πάρα πολλούς τυχαίους αριθμούς. Αυτό σημαίνει ότι αν η Java βγαίνει πιο αργή σε ratio 1:9 στο συγκεκριμένο loop θα έχει ανάλογο ratio και στα υπόλοιπα προβλήματα αυτών των κλάδων.

 

 

ps: Γενικά όταν κάνω πρόχειρα πειράματα με τον υπολογιστή βάζω ηλίθιες ονομασίες στις variables μου. Εξού και:

 

Random fudus = new Random();

Δημοσ.
Και μια παρατηρησει που καποιος φιλος..μου εκανε γνωστο

το MATLAB παιζει ουσιαστικα με Java (ερχεται με το δικο του Virtual Machine)

 

Και τα windows παίζουν με java (~)

 

Το ότι έχει το δικό του VM σίγουρα δεν σημαίνει ότι «παιζει με Java». AFAIK, το matlab έγινε αρχικά με fortran και μετά η εξέλιξή του συνεχίστηκε με C.

 

Αν υπάρχει κάποιος ας μας διαφωτίσει.

Δημοσ.

Απλά όταν είναι εύκολο να δοκιμάσεις κάτι μόνο σου γιατί να μην το κάνεις;

Δε το κάνεις γιατί δεν είναι επιστημονικά τεκμηριωμένο. Δε βγάζεις κανένα ουσιαστικό συμπέρασμα.

 

Εξάλλου το πρόβλημα είναι ότι στο Ίντερνετ υπάρχουν τόσες έρευνες που

μπορείς εύκολα να αποδείξεις και μία θέση και τη άλλη.

Δεν αναφερόμουνα για το "τι μπορείς να βρεις στο Ίντερνετ" αλλά για τα τόσα Journals που έχουνε γραφτεί.

 

Θα προτιμούσα στο θέμα μας να γίνονται post αυτά και η συζήτηση να γινότανε γύρω από τα συμπεράσματα τους.

Δημοσ.

Καταρχάς, δεν εκμεταλεύεσαι το ^2 του Matlab, καθώς και την απίστευτη ικανότητά του με τους πίνακες.

 

Οποιοσδήποτε βρόχος στο Matlab είναι χάλια. Με πίνακες κερδίζεις πολύ σε ταχύτητα.

 

Έκανα και γω παρόμοια τεστς. Χρησιμοποίησα το δικό σου loop κάπως αλλαγμένο και υποστηρίζοντας όλα τα χαρακτηριστικά της γλώσσας.

 

Συγκεκριμένα για την Java ( java version "1.5.0_03", Java 2 Runtime Environment, Standard Edition (build 1.5.0_03-b07), Java HotSpot Client VM (build 1.5.0_03-b07, mixed mode, sharing) ) χρησιμοποίησα

>import java.util.Random;

public class TimeTest {

public static final Random rnd = new Random();

public static void main(String[] args) {
	int N = 30000000;
	int sum = 0;

	long start = System.currentTimeMillis();
	for(int i=0; i<N; i++)
	{
		double x = rnd.nextDouble();
		double y = rnd.nextDouble();
		if (x*x + y*y < 1)
		{
			sum++;
		}
	}
	long end = System.currentTimeMillis();
			
	double time = (double)(end-start);
	System.out.println("Time: " + time/1000D + "secs");
}

}

 

Έκανα και δοκιμές με C (που είναι κατά κανόνα πιο γρήγορη από την C++) με τον gcc ( gcc (GCC) 3.3.5 20050117 (prerelease) (SUSE Linux) ) με flags -std=c99 -O3 (αρκετά heavy optimization) και χωρίς Ο3. Ο κώδικα είναι (linux-specific)

>#include <stdlib.h>
#include <stdio.h>
#include <sys/time.h> 

/* Subtract the `struct timeval' values X and Y,
  storing the result in RESULT.
  Return 1 if the difference is negative, otherwise 0.
  Found in
  http://wwwwbs.cs.tu-berlin.de/user-taipan/kraxel/gnuinfo/libc/High-Resolution_Calendar.html
*/
int timeval_subtract(	struct timeval *result, 
		struct timeval *x,
		struct timeval *y) {
/* Perform the carry for the later subtraction by updating y. */
if (x->tv_usec < y->tv_usec)
{
	int nsec = (y->tv_usec - x->tv_usec) / 1000000 + 1;
	y->tv_usec -= 1000000 * nsec;
	y->tv_sec += nsec;
}
if (x->tv_usec - y->tv_usec > 1000000)
{
	int nsec = (y->tv_usec - x->tv_usec) / 1000000;
	y->tv_usec += 1000000 * nsec;
	y->tv_sec -= nsec;
}

/* Compute the time remaining to wait.
tv_usec  is certainly positive. */
result->tv_sec = x->tv_sec - y->tv_sec;
result->tv_usec = x->tv_usec - y->tv_usec;

/* Return 1 if result is negative. */
return x->tv_sec < y->tv_sec;
}

int main(void) {
int N = 30000000;
int sum = 0;
struct timeval start, end, result;

gettimeofday(&start, NULL);
for(int i=0; i<N; i++)
{
	double x = (double)rand()/RAND_MAX;
	double y = (double)rand()/RAND_MAX;
	
	if (x*x + y*y < 1)
	{
		sum++;
	}
}
gettimeofday(&end, NULL);

timeval_subtract(&result, &end, &start);

printf("Time: %d.%d secs\n", result.tv_sec, result.tv_usec);

return EXIT_SUCCESS;	
}

 

Αποτελέσματα:

  • C -O3 vs java: η C ήταν ~4.4x ταχύτερη (3.4 secs vs 15 secs)
  • C vs java: η C ήταν ~3.1x ταχύτερη (4.8 secs vs 15 secs)

 

Η επόμενη έκδοση αναμένεται να κλείσει και άλλο την ψαλίδα. Πάντως για μια σχεδόν interpreted γλώσσα τα πάει καλά.

Δημοσ.

Ευχαριστώ για το post σου dop,

 

Αρχικά δεν χρησιμοποίησα το ^2 γιατί είχα πρόβλημα στις άλλες γλώσσες. Ας πούμε, στην VB ο τελεστής ^2 είναι περίπου 2 φορές πιο αργός από τον τελεστή * (lol!). Με ανέβαζε από τα 1002 s στα 2400 s. Και στη Java είδα μεγάλη διαφορά ταχύτητας, οπότε όταν έφτασα στο Matlab δεν το έψαξα ποιος τελεστής είναι πιο γρήγορος.

 

Επίσης, σε τι μηχάνημα έκανες τις δοκιμές; Αυτό το ρωτάω επειδή σε εμένα οι 30000000 επαναλήψεις δίνουν στη C μικρότερο χρόνο από 1 s οπότε δεν γίνεται να κάνω σύγκριση.

 

Αν είναι δυνατό στείλε μου το class file στο [email protected].

 

-edit-

 

Πριν μου το στείλεις αν γίνεται άλλαξε τις επαναλήψεις σε 100.000.000.

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...