Profiling στη Java
Profiling στη Java
Έχω εντοπίσει μία κατηγορία προγραμμάτων που ονομάζονται 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 που δεν περιείχε καμία μέθοδο).
Εκτελούν τα προγράμματα σου και μετά σου βγάζουν μερικά στατιστικα όπως πόσο χρόνο απαιτεί να εκτελεστεί η κάθε μέθοδος και πόση μνήμη απαιτούν από το σωρό (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 που δεν περιείχε καμία μέθοδο).
- AmmarkoV
- Wow! Terabyte level
- Posts: 2838
- Joined: Thu Nov 04, 2004 2:55 pm
- Gender: ♂
- Location: Reloaded @ Santa Friday
- Contact:
Ωραία τα links..
Πάντως γνώμη μου , που έχω εκφράσει και σε άλλα threads σε σχέση με προγραμματισμό (οπότε δεν προκειται να την επαναλάβω παρα μόνο επιγραμματικά) είναι πως Java και ταχύτητα ούτως ή άλλως δεν πάνε μαζί..
Πάντως γνώμη μου , που έχω εκφράσει και σε άλλα threads σε σχέση με προγραμματισμό (οπότε δεν προκειται να την επαναλάβω παρα μόνο επιγραμματικά) είναι πως Java και ταχύτητα ούτως ή άλλως δεν πάνε μαζί..
- Spoiler: εμφάνιση/απόκρυψη

Ναι το θέμα είναι ότι, όταν χρησιμοποιείς Java να πετύχεις την καλύτερη απόδοση.AmmarkoV wrote:Ωραία τα links..
Πάντως γνώμη μου , που έχω εκφράσει και σε άλλα threads σε σχέση με προγραμματισμό (οπότε δεν προκειται να την επαναλάβω παρα μόνο επιγραμματικά) είναι πως Java και ταχύτητα ούτως ή άλλως δεν πάνε μαζί..
- Skeftomilos
- bit level
- Posts: 43
- Joined: Fri Mar 04, 2005 8:08 am
- Location: Ν.Κόσμος
Έχεις σκεφτεί πώς αλλιώς θα μπορούσε να γίνει?yioan wrote:Η απλή πράξη + δύο συμβολοσειρών δεν είναι και τόσο φθηνή τελικά. Αφού κατάλαβα ότι δεν ήταν πολύ φθηνή πράξη το έψαξα και βρήκα ότι την ένωση το δύο συμβολοσειρών την πετυχαίνει δημιουργώντας ένα αντικείμενο StringBuffer, κάνει append τις συμβολοσειρές και επιστρέφει το .toString(). Δεν μπορώ να καταλάβω γιατί το έχουν φτιάξει έτσι.
Τα string είναι immutable (αμετάβλητα) αντικείμενα. Ο μόνος τρόπος να αλλάξει ένα string είναι να δημιουργηθεί ένα νέο. Όμως η συνεχής δέσμευση και μεταφορά bytes στη μνήμη μπορεί να γονατίσει μία εφαρμογή. Αν εντοπίσεις κάτι τέτοιο σε βρόγχο, μάλλον βρήκες το bottleneck της εφαρμογής! Στο .NET υπάρχει το αντικείμενο StringBuilder που λύνει το πρόβλημα.
Τα value-types (integer, decimal, date κ.λπ.) είναι άμεσα προσβάσιμα και επομένως ταχύτερα από τα αντικείμενα, η πρόσβαση στα οποία γίνεται μέσω αναφοράς (reference-types).yioan wrote:Η τάξη Integer λειτουργεί γρηγορότερα από οποιαδήποτε MyInt φτιάξεται.
The pure and simple truth is rarely pure and never simple. Ο μη νους δε σκέπτεται μη σκέψεις για το τίποτα.
- HdkiLLeR
- Venus Project Founder
- Posts: 4356
- Joined: Tue Jan 27, 2004 4:41 pm
- Academic status: Alumnus/a
- Gender: ♂
- Location: New York, NY
- Contact:
Η Integer(Double,Character,Float, Byte...) δεν είναι value type είναι κανονική class(wrapper class) οπότε πρόκειται περι κανονικού object. Στην πραγματικότητα έχει δημιουργηθεί για να μπρούν οι libs(maps,vectors,hashtables κλπ) να βλέπουν ακεραίους, χαρακτήρες κλπ κλπ και να τους μεταχειρίζονται σαν να ήταν Objects. Απλά θα υπάρχει κάποιο opt παραπάνω.Skeftomilos wrote: Τα value-types (integer, decimal, date κ.λπ.) είναι άμεσα προσβάσιμα και επομένως ταχύτερα από τα αντικείμενα, η πρόσβαση στα οποία γίνεται μέσω αναφοράς (reference-types).
-----BEGIN GEEK CODE BLOCK-----
Version: 3.12
GCS d-->--- s+:+ a- C++(+++) BILS++++$ P--- L++++>+++++ E--- W+++ N+ o+ K w--
O M+ V-- PS++>+++ PE- Y++ PGP++ t+ 5+ X+ R* tv b++ DI- D+ G+++ e+++>++++ h r++ y++
------END GEEK CODE BLOCK------
"UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity." -- Dennis Ritchie
Version: 3.12
GCS d-->--- s+:+ a- C++(+++) BILS++++$ P--- L++++>+++++ E--- W+++ N+ o+ K w--
O M+ V-- PS++>+++ PE- Y++ PGP++ t+ 5+ X+ R* tv b++ DI- D+ G+++ e+++>++++ h r++ y++
------END GEEK CODE BLOCK------
"UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity." -- Dennis Ritchie
- Skeftomilos
- bit level
- Posts: 43
- Joined: Fri Mar 04, 2005 8:08 am
- Location: Ν.Κόσμος
Δεν υπάρχει λόγος να είναι μία value-type μόνιμα μέσα σε μία wrapper class. Μόνο όταν πρέπει να μπει σε ένα ArrayList ή HashTable. Αυτή η διαδικασία λέγεται boxing.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.
The pure and simple truth is rarely pure and never simple. Ο μη νους δε σκέπτεται μη σκέψεις για το τίποτα.
Στη Java υπάρχει το StringBuffer. Αν δεν κάνω λάθος υπάρχει και StringBuilder από την Java 1.5. Το πρόβλημα είναι ότι κανένας δεν το χρησιμοποιεί γιατί σε όλους αρέσει να γράφουν s1=s1+"somethingnew".Στο .NET υπάρχει το αντικείμενο StringBuilder που λύνει το πρόβλημα.
Αυτό δεν είναι κακό αλλά αν υπάρχει ένα for από πάνω και το + εκτελείται 10000 φόρες τότε λέμε... η Java είναι αργή


- Skeftomilos
- bit level
- Posts: 43
- Joined: Fri Mar 04, 2005 8:08 am
- Location: Ν.Κόσμος
Ακόμα περισσότερο τους αρέσει να γράφουν s1+="somethingnew". Προσωπικά δεν περιμένω τα παράπονα για την κακή απόδοση για να κάνω εκ των υστέρων το σχετικό optimization. Όταν τα loops είναι πολλά ... StringBuilder χωρίς δεύτερη σκέψη.yioan wrote:σε όλους αρέσει να γράφουν s1=s1+"somethingnew"
Που να δεις η VB6 πόσο αργή μπορεί να είναι!yioan wrote:αν υπάρχει ένα for από πάνω και το + εκτελείται 10000 φόρες τότε λέμε... η Java είναι αργή

The pure and simple truth is rarely pure and never simple. Ο μη νους δε σκέπτεται μη σκέψεις για το τίποτα.
- HdkiLLeR
- Venus Project Founder
- Posts: 4356
- Joined: Tue Jan 27, 2004 4:41 pm
- Academic status: Alumnus/a
- Gender: ♂
- Location: New York, NY
- Contact:
Δεν αναφέρω κάτι διαφορετικό παραπάνωSkeftomilos wrote: Δεν υπάρχει λόγος να είναι μία value-type μόνιμα μέσα σε μία wrapper class. Μόνο όταν πρέπει να μπει σε ένα ArrayList ή HashTable. Αυτή η διαδικασία λέγεται boxing.

-----BEGIN GEEK CODE BLOCK-----
Version: 3.12
GCS d-->--- s+:+ a- C++(+++) BILS++++$ P--- L++++>+++++ E--- W+++ N+ o+ K w--
O M+ V-- PS++>+++ PE- Y++ PGP++ t+ 5+ X+ R* tv b++ DI- D+ G+++ e+++>++++ h r++ y++
------END GEEK CODE BLOCK------
"UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity." -- Dennis Ritchie
Version: 3.12
GCS d-->--- s+:+ a- C++(+++) BILS++++$ P--- L++++>+++++ E--- W+++ N+ o+ K w--
O M+ V-- PS++>+++ PE- Y++ PGP++ t+ 5+ X+ R* tv b++ DI- D+ G+++ e+++>++++ h r++ y++
------END GEEK CODE BLOCK------
"UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity." -- Dennis Ritchie