Page 1 of 1
Profiling στη Java
Posted: Wed Apr 06, 2005 1:33 pm
by yioan
Έχω εντοπίσει μία κατηγορία προγραμμάτων που ονομάζονται Profilers:
Εκτελούν τα προγράμματα σου και μετά σου βγάζουν μερικά στατιστικα όπως πόσο χρόνο απαιτεί να εκτελεστεί η κάθε μέθοδος και πόση μνήμη απαιτούν από το σωρό (Heap Memory). Το έχω δοκιμάσει με ένα plugin στο Eclipse IDE για Java και είναι καταπληκτικό. Για όσους ενδιαφέρονται:
Στο Eclipse IDE, το Plugin ονομάζεται Eclipse Profiler και είναι αρκετά εύκολο στη χρήση. (
http://eclipsecolorer.sourceforge.net/)
Για Netbeans δεν το έχω δοκιμάσει αλλά υπάρχει κάτι αντιστοιχο στη διεύθυνση
http://profiler.netbeans.org/
Μερικά συμπεράσματα μετά από profiling:
Η απλή πράξη + δύο συμβολοσειρών δεν είναι και τόσο φθηνή τελικά. Αφού κατάλαβα ότι δεν ήταν πολύ φθηνή πράξη το έψαξα και βρήκα ότι την ένωση το δύο συμβολοσειρών την πετυχαίνει δημιουργώντας ένα αντικείμενο StringBuffer, κάνει append τις συμβολοσειρές και επιστρέφει το .toString(). Δεν μπορώ να καταλάβω γιατί το έχουν φτιάξει έτσι.
Η τάξη Integer λειτουργεί γρηγορότερα από οποιαδήποτε MyInt φτιάξεται. Για να πετύχω καλύτερη ταχύτητα δήθεν έφτιαξα μία τάξη Int η οποία περιείχε μία μόνο Public μεταβλητή, έναν ακέραιο έτσι ώστε να αντικαταστήσω την τάξη Integer με αυτή. Σε ένα πειραματικό πρόγραμμα(Alpha έκδοση 0.00003) που απαιτούσε 38 δευτερόλεπτα να εκτελεστεί εκτελέστηκε σε 46 (ναι, με την νέα εξελιγμένη Int που δεν περιείχε καμία μέθοδο).
Posted: Wed Apr 06, 2005 4:08 pm
by AmmarkoV
Ωραία τα links..
Πάντως γνώμη μου , που έχω εκφράσει και σε άλλα threads σε σχέση με προγραμματισμό (οπότε δεν προκειται να την επαναλάβω παρα μόνο επιγραμματικά) είναι πως Java και ταχύτητα ούτως ή άλλως δεν πάνε μαζί..
Posted: Wed Apr 06, 2005 9:03 pm
by yioan
AmmarkoV wrote:Ωραία τα links..
Πάντως γνώμη μου , που έχω εκφράσει και σε άλλα threads σε σχέση με προγραμματισμό (οπότε δεν προκειται να την επαναλάβω παρα μόνο επιγραμματικά) είναι πως Java και ταχύτητα ούτως ή άλλως δεν πάνε μαζί..
Ναι το θέμα είναι ότι, όταν χρησιμοποιείς Java να πετύχεις την καλύτερη απόδοση.
Posted: Wed Apr 06, 2005 11:43 pm
by AmmarkoV
Όχι δίκιο έχεις , είναι πολύ καλά και χρήσιμα τα links , όπως είπες και εσυ να βελτιώσει κανείς την απόδοσή των προγραμμάτων που γράφει ..

Posted: Sun Apr 10, 2005 3:26 pm
by Skeftomilos
yioan wrote:Η απλή πράξη + δύο συμβολοσειρών δεν είναι και τόσο φθηνή τελικά. Αφού κατάλαβα ότι δεν ήταν πολύ φθηνή πράξη το έψαξα και βρήκα ότι την ένωση το δύο συμβολοσειρών την πετυχαίνει δημιουργώντας ένα αντικείμενο StringBuffer, κάνει append τις συμβολοσειρές και επιστρέφει το .toString(). Δεν μπορώ να καταλάβω γιατί το έχουν φτιάξει έτσι.
Έχεις σκεφτεί πώς αλλιώς θα μπορούσε να γίνει?
Τα string είναι immutable (αμετάβλητα) αντικείμενα. Ο μόνος τρόπος να αλλάξει ένα string είναι να δημιουργηθεί ένα νέο. Όμως η συνεχής δέσμευση και μεταφορά bytes στη μνήμη μπορεί να γονατίσει μία εφαρμογή. Αν εντοπίσεις κάτι τέτοιο σε βρόγχο, μάλλον βρήκες το bottleneck της εφαρμογής! Στο .NET υπάρχει το αντικείμενο StringBuilder που λύνει το πρόβλημα.
yioan wrote:Η τάξη Integer λειτουργεί γρηγορότερα από οποιαδήποτε MyInt φτιάξεται.
Τα value-types (integer, decimal, date κ.λπ.) είναι άμεσα προσβάσιμα και επομένως ταχύτερα από τα αντικείμενα, η πρόσβαση στα οποία γίνεται μέσω αναφοράς (reference-types).
Posted: Sun Apr 10, 2005 4:44 pm
by HdkiLLeR
Skeftomilos wrote:
Τα value-types (integer, decimal, date κ.λπ.) είναι άμεσα προσβάσιμα και επομένως ταχύτερα από τα αντικείμενα, η πρόσβαση στα οποία γίνεται μέσω αναφοράς (reference-types).
Η Integer(Double,Character,Float, Byte...) δεν είναι value type είναι κανονική class(wrapper class) οπότε πρόκειται περι κανονικού object. Στην πραγματικότητα έχει δημιουργηθεί για να μπρούν οι libs(maps,vectors,hashtables κλπ) να βλέπουν ακεραίους, χαρακτήρες κλπ κλπ και να τους μεταχειρίζονται σαν να ήταν Objects. Απλά θα υπάρχει κάποιο opt παραπάνω.
Posted: Mon Apr 11, 2005 2:37 pm
by Skeftomilos
MSDN .NET Type Fundamentals wrote:There are some performance issues to consider when working with reference types. First, the memory must be allocated from the managed heap, which could force a garbage collection to occur. Second, reference types are always accessed via their pointers. So every time your code references any member of an object on the heap, code must be generated and executed to dereference the pointer in order to perform the desired action. This adversely affects both size and speed.
...
When possible, you should use value types instead of reference types because your application's performance will be better.
...
The main advantage of value types is that they are not allocated in the managed heap. Of course, value types have several limitations compared with reference types.
...
Value type objects have two representations: an unboxed form and a boxed form. Reference types are always in a boxed form.
Δεν υπάρχει λόγος να είναι μία value-type μόνιμα μέσα σε μία wrapper class. Μόνο όταν πρέπει να μπει σε ένα ArrayList ή HashTable. Αυτή η διαδικασία λέγεται boxing.
Posted: Mon Apr 11, 2005 6:43 pm
by yioan
Στο .NET υπάρχει το αντικείμενο StringBuilder που λύνει το πρόβλημα.
Στη Java υπάρχει το StringBuffer. Αν δεν κάνω λάθος υπάρχει και StringBuilder από την Java 1.5. Το πρόβλημα είναι ότι κανένας δεν το χρησιμοποιεί γιατί σε όλους αρέσει να γράφουν s1=s1+"somethingnew".
Αυτό δεν είναι κακό αλλά αν υπάρχει ένα for από πάνω και το + εκτελείται 10000 φόρες τότε λέμε... η Java είναι αργή

Posted: Mon Apr 11, 2005 10:31 pm
by Skeftomilos
yioan wrote:σε όλους αρέσει να γράφουν s1=s1+"somethingnew"
Ακόμα περισσότερο τους αρέσει να γράφουν s1+="somethingnew". Προσωπικά δεν περιμένω τα παράπονα για την κακή απόδοση για να κάνω
εκ των υστέρων το σχετικό optimization. Όταν τα loops είναι πολλά ... StringBuilder χωρίς δεύτερη σκέψη.
yioan wrote:αν υπάρχει ένα for από πάνω και το + εκτελείται 10000 φόρες τότε λέμε... η Java είναι αργή
Που να δεις η VB6 πόσο αργή μπορεί να είναι!

Posted: Wed Apr 13, 2005 12:39 pm
by HdkiLLeR
Skeftomilos wrote:
Δεν υπάρχει λόγος να είναι μία value-type μόνιμα μέσα σε μία wrapper class. Μόνο όταν πρέπει να μπει σε ένα ArrayList ή HashTable. Αυτή η διαδικασία λέγεται boxing.
Δεν αναφέρω κάτι διαφορετικό παραπάνω

το ίδιο πράγμα λέμε. Απλά εγώ αναφέρομαι σε Java platform μόνο που γνωρίζω και εκεί χρειάζεται αυτό για κάθε class που ανήκει στα utils, δεν έχω ασχοληθεί με M$ products.