Βελτιώνοντας τις εφαρμογές: Profiling

Ανάμεσα στα κύρια εργαλεία που χρειάζονται όταν αναπτύσσουμε ή αναβαθμίζουμε ένα πρόγραμμα, εκτός από έναν debugger (αποσφαλματωτή), πρέπει να είναι και ένας profiler (καταγραφέας ή αναλυτής προγράμματος).

Στην καταγραφή (profiling) συλλέγονται πληροφορίες κατά τη διάρκεια της εκτέλεσης ενός προγράμματος, με απώτερο σκοπό να προσδιοριστεί ο χρόνος εκτέλεσης και οι απαιτήσεις μνήμης που έχουν τα επιμέρους κομμάτια ενός προγράμματος. Με αυτήν την διαδικασία μπορεί να αποδοθεί ο χρόνος που προσδίδει στον τελικό χρόνο εκτέλεσης κάθε συνάρτηση ή τμήμα του προγράμματος.

Τα αποτελέσματα αυτά μπορούν να χρησιμοποιηθούν για μια στοχευμένη βελτιστοποίηση έτσι ώστε να δίδεται βάρος στα κομμάτια που πραγματικά αποσπούν σημαντικό χρόνο σε σχέση με λιγότερο χρονοβόρα τμήματα. Φυσικά αυτή η διαδικασία μπορεί να χρησιμοποιηθεί πέρα από τη βελτιστοποίηση και για την σταδιακή παραλληλοποίηση ενός προγράμματος, ξεκινώντας από τα πιο απαιτητικά σε χρόνο και μνήμη τμήματα του προγράμματος, και συνεχίζοντας με τα λιγότερα απαιτητικά. Έτσι, ακόμα και με μια παράλληλη συνάρτηση μπορεί να υπάρξει αισθητή διαφορά στον χρόνο εκτέλεσης.

Γενικά δίδονται εργαλεία καταγραφής από τις συλλογές και τις σουίτες μεταγλωττιστών που χρησιμοποιεί ο προγραμματιστής. Σαν βάση χρησιμοποιείται η πρόταση του ανοικτού λογισμικού gprof από την GNU Compiler Suite, με τους περισσότερους μεταγλωττιστές να βγάζουν αποτελέσματα συμβατά με τον συγκεκριμένο καταγραφέα.

Για να μπορέσει ο compiler να δώσει τις απαραίτητες εντολές στο πρόγραμμα και να παράγει την απαραίτητη πληροφορία που αναφέρεται πιο πάνω, το πρόγραμμα πρέπει να γίνει link και compile με κάποιο συγκεκριμένο FLAG, συνήθως το “-pg” (ανάλογα και με τον μεταγλωττιστή που χρησιμοποιείται). Φυσικά ο χρόνος εκτέλεσης ενός προγράμματος που παράγει δεδομένα profiling, είναι αισθητά πιο αργός σε σχέση με το κανονικό και γενικά ένα εκτελέσιμο που αποδίδει δεδομένα profiling χρησιμοποιείται μόνο για αυτόν τον σκοπό.

Gprof2Dot

Ένα αρκετά απλό και ελκυστικό εργαλείο που αποδίδει εποπτικά την πληροφορία που παράγεται από το profiling μιας εφαρμογής, είναι το Gprof2Dot. Το Gprof2Dot, το οποίο βρίσκεται εγκατεστημένο στον διακομιστή, αναπαριστά σε ένα γράφο (Call Graph) τις εξαρτήσεις και τα ποσοστά του χρόνου εκτέλεσης από κάθε συνάρτηση και μπορεί να τα αποθηκευτεί σε μορφή εικόνας, πχ PNG.

Ένα τυπικό workflow για την ανάλυση κάποιο προγράμματος είναι ο ακόλουθος:

Το αποτέλεσμα μπορείτε να το δείτε απευθείας από την κονσόλα του με την εντολή:

Τυπικό αποτέλεσμα μιας εφαρμογής είναι το ακόλουθο:

Επειδή η καταγραφή λειτουργεί δειγματοληπτικά, διαφορετικές εκτελέσεις της ίδιας εφαρμογής γίνεται να αποδώσουν διαφορετικά αποτελέσματα. Αυτός είναι ένας λόγος που προτείνεται να συγκεντρώνονται και να αναλύονται αποτελέσματα από πολλές εκτελέσεις.

Parallel Profilers

Λόγω της διαφορετικής αρχιτεκτονικής σύνδεσης και υλοποίησης κατανεμημένων υπολογιστικών πόρων, για τα προγράμματα που κάνουν χρήση παραλληλισμού δεν είναι δυνατό οι σειριακοί καταγραφείς να παρέχουν μια έγκυρη εικόνα για τον καταμερισμό την κατανάλωσης των πόρων στα τμήματα του προγράμματος. Για αυτό το σκοπό έχουν δημιουργηθεί ειδικοί καταγραφείς για παράλληλες εφαρμογές. Τυπικά παραδείγματα είναι η ανοιχτού λογισμικού εργαλειοθήκη Scalasca που έχει αναπτυχθεί από το εργαστήριο Jülich και η εμπορική σουίτα Allinea OPT. Οδηγίες χρήσης του παράλληλου καταγραφέα Scalasca στο μπορείτε να βρείτε εδώ.

Χρήσιμοι σύνδεσμοι

* Sourceware.org
* CS Utah
* Linuxtopia