alkisg Δημοσ. 18 Αυγούστου 2005 Δημοσ. 18 Αυγούστου 2005 Πάντως η random πιάνει ένα σημαντικότατο μέρος του χρόνου εκτέλεσης των προγραμμάτων σου, τόσο που ουσιαστικά δεν κάνεις σύγκριση γλωσσών αλλά κυρίως της υλοποίησης της random. Δηλαδή θα μπορούσες να έχεις ονομάσει το topic "Ταχύτητα της random σε διάφορες γλώσσες και VMs". Αν έχεις όρεξη μπορείς να βγάλεις πιο αξιόπιστα αποτελέσματα για την ταχύτητα της random αφαιρώντας τον χρόνο εκτέλεσης από τους παρακάτω κώδικες: >time( &start ); while (i++ < N) { x = (double)rand()*max/RAND_MAX; y = (double)rand()*max/RAND_MAX; } time( &stop ); και >time( &start ); while (i++ < N) { x = (double)1.0*max/RAND_MAX; y = (double)1.0*max/RAND_MAX; } time( &stop ); (φυσικά το ίδιο θα μπορούσε να γίνει και με σκέτες επαναλήψεις χωρίς x και y κτλ, απλά πήρα σαν βάση τον κώδικα που έδωσες). Το if (x*x+y*y < 1) sum++; το έβγαλα γιατί κάνει το συνολικό χρόνο να εξαρτάται από τη random, δηλαδή σε διαφορετικές εκτελέσεις το if θα "ισχύει" διαφορετικό αριθμό φορών, εκτελώντας ή όχι αντίστοιχα το sum++. Ακόμα και αφού βρεις συγκεκριμένες τιμές για τη random, πάλι δεν έχει ακριβές νόημα η μέτρηση. Θα πρέπει να δεις και ποιον αλγόριθμο υλοποιεί η κάθε γλώσσα (ANSI / Mersenne Twister / Blum Blum Shub / BSD / ISAAC κτλ). Αν μιλάμε για διαφορετική "ποιότητα" αλγορίθμων, είναι λογικό να υπάρχει και η αντίστοιχη διαφορά στην ταχύτητα. Θα μπορούσες δηλαδή να δεις 3-4 φορές γρηγορότερα ή αργότερα προγράμματα ακόμα και στην ίδια γλώσσα. Επιτρέψτε μου να διορθώσω και δυο ανακρίβειες, το Delphi (για Win32) δεν έχει Garbage Collector και το OpenOffice δεν είναι γραμμένο σε Java.
GothicCrusader Δημοσ. 19 Αυγούστου 2005 Μέλος Δημοσ. 19 Αυγούστου 2005 Epishs xwris na eimai apolytos gnwsths tou olou 8ematos' date=' den exw dei ma8hmatiko na douleuei se Java opote gia to sigekrimeno 8ema pou testareis tis glwesses, xronous mikrous 8a deis me glwesses opos C, fortan, C++ (isws) kai xronous ikanopoihtikous 8a deis me ma8hmatika paketa opos to Matlab. Giati sou fanike parakseno o xronos pou edwse to Matlab?[/quote'] Η αλήθεια είναι ότι περίμενα χειρότερη ταχύτητα από το Matlab και καλύτερη από τη Java, δηλαδή η Java μου φάνηκε τραγικά αργή και το Matlab ελαφρά πιο γρήγορο από το αναμενόμενο. Προφανώς έχουν κάνει πολύ καλή δουλειά ;-)
GothicCrusader Δημοσ. 19 Αυγούστου 2005 Μέλος Δημοσ. 19 Αυγούστου 2005 Πάντως η random πιάνει ένα σημαντικότατο μέρος του χρόνου εκτέλεσης των προγραμμάτων σου' date=' τόσο που ουσιαστικά δεν κάνεις σύγκριση γλωσσών αλλά κυρίως της υλοποίησης της random. Δηλαδή θα μπορούσες να έχεις ονομάσει το topic "Ταχύτητα της random σε διάφορες γλώσσες και VMs". [/quote'] Έχεις απόλυτο δίκιο. Αυτό με προβλημάτισε αρκετά την ώρα που έκανα τη δοκιμή. Ίσως έτσι θα μπορούσε να αποφύγουμε αρκετές παρεξηγήσεις. Επίσης, τη δοκιμή που προτείνεις θα τη δοκιμάσω μέσα στην εβδομάδα από περιέργεια. Παρόλα αυτά αντιμετώπισα και άλλα προβλήματα. Π.χ. τη δοκιμή του Dop δεν μπόρεσα να την επαληθεύσω ακόμα και σε linux. Χρησιμοποίησα το δικό του class file για να είμαι 1000% σίγουρος ότι δεν παίζουν flags κατά το compile της Java αλλά συνέχισα να παίρνω πολύ (!) καλύτερες ταχύτητες στη C από τη Java ακόμα και σε linux. Οπότε τα προβλήματα είναι πολλά. Τέσπα το πρόβλημα επίσης είναι ότι το linux που έχω είναι σε αρκετά μικρότερο cpu οπότε δεν μπορώ να κάνω συγκρίσεις στο σπίτι. Το if (x*x+y*y < 1) sum++; το έβγαλα γιατί κάνει το συνολικό χρόνο να εξαρτάται από τη random' date=' δηλαδή σε διαφορετικές εκτελέσεις το if θα "ισχύει" διαφορετικό αριθμό φορών, εκτελώντας ή όχι αντίστοιχα το sum++. [/quote'] Εδώ απαντάω καθαρά για εγκυκλοπαιδικούς λόγους και όχι για να αντικρούσω αυτά που λες καθώς αυτά εξακολουθούν να ισχύουν άσχετα από αυτά που θα γράψω. Παρόλο που εκ πρώτης άποψης φαίνεται να ισχύει κάτι τέτοιο σε κάποιον που είναι προγραμματιστής ή διαβάζει τον κώδικα, στην πράξη, πρόκειται για μία μαθηματική παγίδα που δεν ξέρω αν είμαι σε θέση να σου εξηγήσω μέσα από το forum. Αν είσαι φυσικος, μαθηματικός ή τέλος πάντων αν ξέρεις καλά μαθηματικά μπορεί ίσως να καταλάβεις τι εννοώ. Το if στο loop δεν κάνει τον συνολικό χρόνο να εξαρτάται από τη random (για δεδομένο αριθμό συνολικών επαναλήψεων) γιατί τείνει να είναι σταθερός αριθμός εφόσον η βιβλιοθήκη παράγει αριθμούς σε ομοιόμορφη κατανομή. Αυτό μπορείς να το φανταστείς ισοδύναμο με το γεγονός ότι αν έχεις ομοιόμορφη κατανομή πληθυσμού με δεδομένα όρια (πες 1,5 και 2 μέτρα ύψος το άτομο) τότε η μέση τιμή τείνει να είναι ανεξάρτητη από τον αριθμό του πληθυσμού εφόσον αυτός είναι αρκετά μεγάλος και εφόσον σε κάθε περίπτωση η κατανομή είναι η ίδια (προφανές). Δοκίμασε το loop σε όλες τις γλώσσες με ίδιο αριθμό επαναλήψεων (π.χ. 300.000.000) και θα δεις ότι για πολύ μεγάλο αριθμό επαναλήψεων το sum τείνει να είναι πιο κοντά σε ένα συγκεκριμένο αριθμό που είναι συνάρτηση του αριθμού επαναλήψεων αλλά δεν είναι συνάρτηση του σετ των τυχαίων αριθμών. Δηλαδή υπό σταθερό Ν, σε όλες τις εκτελέσεις το if γίνεται true προσεγγιστικά το ίδιο αριθμό φορών ανεξάρτητα από τους συγκεκριμένους ψευδοτυχαίους αριθμούς που θα κληρώσει η random. Στις μετρήσεις μου ο αριθμός επαναλήψεων είναι ο ίδιος και η κατανομή είναι η ίδια (σε όλες τις γλώσσες εκτός από την PHP οι βιβλιοθήκες δίνουν πρακτικά ομοιόμορφη κατανομή) οπότε ο αριθμός εκτέλεσης των if είναι προσεγγιστικά ο ίδιος και συμβάλλει αμελητέα η ταχύτητα εκτέλεσης των βιβλιοθηκών. Αυτό δεν ισχύει βέβαια για τις κλήσεις που αποθηκεύουν τις τιμές στα x, y. Βέβαια το if πρέπει αναγκαστικά να αφαιρεθεί γιατί δεν είναι ο ίδιος ο αριθμός που θα εκτελεστεί όταν αφαιρεθούν οι random αφού έχουμε σταθερούς αριθμούς στα X, Y. Τελικά το συμπέρασμα είναι το ίδιο αλλά η αιτιολογία είναι διαφορετική. Για να προστεθεί if στο δεύτερο μπλοκ, όπου έχουν αφαιρεθεί οι random, θα πρέπει να μπει κάτι τέτοιο: > double limit = (1/4)*pi*N ... ... if (sum < limit) sum++ Ελπίζω να σε μπέρδεψα λίγο
Turrican Δημοσ. 24 Αυγούστου 2005 Δημοσ. 24 Αυγούστου 2005 χεχε μολις βρήκα μπροστά μου κάποιες μετρήσεις που "αποδεικνύουν" πως η java είναι *πιο γρήγορη* και από την C! http://java.sys-con.com/read/45250.htm
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.