Κατά τη σύνταξη μακροχρόνιων εφαρμογών - το είδος των προγραμμάτων που θα περνούν το μεγαλύτερο μέρος της ημέρας ελαχιστοποιούνται στη γραμμή εργασιών ή δίσκο συστήματος, μπορεί να είναι σημαντικό να μην αφήνετε το πρόγραμμα να «ξεφύγει» με τη χρήση μνήμης.
Οι δύο στήλες στη δεξιά πλευρά δείχνουν τη χρήση της CPU (χρόνο) και τη χρήση της μνήμης. Εάν μια διαδικασία επηρεάζει σοβαρά κάτι από αυτά, το σύστημά σας θα επιβραδυνθεί.
Το είδος του αντικειμένου που συχνά επηρεάζει τη χρήση της CPU είναι ένα πρόγραμμα που είναι looping (ζητήστε οποιονδήποτε προγραμματιστή που έχει ξεχάσει να βάλει μια δήλωση "read next" σε ένα βρόχο επεξεργασίας αρχείων). Αυτά τα προβλήματα συνήθως διορθώνονται εύκολα.
Η χρήση της μνήμης, από την άλλη πλευρά, δεν είναι πάντοτε εμφανής και πρέπει να διαχειρίζεται περισσότερο από το διορθωμένο. Υποθέστε, για παράδειγμα, ότι εκτελείται ένα πρόγραμμα τύπου καταγραφής.
Αυτό το πρόγραμμα χρησιμοποιείται σωστά καθ 'όλη τη διάρκεια της ημέρας, πιθανώς για τηλεφωνική σύλληψη σε γραφείο βοήθειας ή για κάποιο άλλο λόγο. Δεν έχει νόημα να κλείνετε κάθε είκοσι λεπτά και στη συνέχεια να το ξαναρχίζετε. Θα χρησιμοποιηθεί όλη την ημέρα, αν και σε σπάνια διαστήματα.
Εάν το πρόγραμμα αυτό βασίζεται σε κάποια βαριά εσωτερική επεξεργασία ή έχει πολλά έργα τέχνης στις μορφές του, αργά ή γρήγορα χρήση μνήμης θα αυξηθεί, αφήνοντας λιγότερη μνήμη για άλλες πιο συχνές διαδικασίες, ωθώντας τη δραστηριότητα τηλεειδοποίησης και τελικά επιβράδυνση του υπολογιστή.
Ας πούμε ότι πρόκειται να σχεδιάσετε ένα πρόγραμμα με την κύρια μορφή και δύο επιπλέον (modal) έντυπα. Συνήθως, ανάλογα με την έκδοση Delphi, οι Delphi πρόκειται να εισάγουν τις μορφές στο μονάδα έργου (Αρχείο DPR) και θα περιλαμβάνει μια γραμμή για τη δημιουργία όλων των μορφών κατά την εκκίνηση της εφαρμογής (Εφαρμογή. ΔημιουργίαForm (...)
Οι γραμμές που περιλαμβάνονται στη μονάδα του έργου είναι σχεδιασμένες από τους Delphi και είναι ιδανικές για ανθρώπους που δεν είναι εξοικειωμένοι με τους Δελφούς ή μόλις αρχίζουν να το χρησιμοποιούν. Είναι βολικό και εξυπηρετικό. Σημαίνει επίσης ότι όλες οι μορφές πρόκειται να δημιουργηθούν όταν ξεκινήσει το πρόγραμμα και όχι όταν χρειάζονται.
Ανάλογα με το έργο σας και τη λειτουργικότητα που έχετε εφαρμόσει, μια φόρμα μπορεί να χρησιμοποιήσει πολλή μνήμη οι μορφές (ή γενικά: αντικείμενα) πρέπει να δημιουργούνται μόνο όταν χρειάζεται και να καταστρέφονται (ελευθερώνονται) μόλις δεν είναι πλέον απαραίτητη.
Και οι δύο "DialogForm" και "OccasionalForm" πρέπει να αφαιρεθούν από τη λίστα "Αυτόματη δημιουργία φορμών" και να μετακινηθούν στη λίστα "Διαθέσιμες φόρμες".
Λάβετε υπόψη ότι η στρατηγική που περιγράφεται εδώ βασίζεται στην υπόθεση ότι το εν λόγω πρόγραμμα είναι ένα πρόγραμμα τύπου «σύλληψης» σε πραγματικό χρόνο. Μπορεί, ωστόσο, να προσαρμοστεί εύκολα για διαδικασίες τύπου παρτίδας.
Δελφοί έχει προσπαθήσει να ελαχιστοποιήσει αυτό και έχει τη δική του αρχιτεκτονική διαχείρισης μνήμης που χρησιμοποιεί πολύ μικρότερα τετράγωνα, αλλά αυτό είναι σχεδόν άχρηστο στο περιβάλλον των Windows επειδή η κατανομή μνήμης τελικά στηρίζεται στο λειτουργικό σύστημα.
Μόλις τα Windows τοποθετήσουν ένα μπλοκ μνήμης σε μια διαδικασία, και αυτή η διαδικασία απελευθερώνει το 99,9% της μνήμης, Τα Windows θα εξακολουθούν να αντιλαμβάνονται ολόκληρο το μπλοκ που χρησιμοποιείται, ακόμα και αν υπάρχει μόνο ένα byte του μπλοκ μεταχειρισμένος. Τα καλά νέα είναι ότι τα Windows παρέχουν έναν μηχανισμό για να καθαρίσουν αυτό το πρόβλημα. Το κέλυφος μας παρέχει ένα API που ονομάζεται SetProcessWorkingSetSize. Εδώ είναι η υπογραφή:
Εξ ορισμού, η συνάρτηση SetProcessWorkingSetSize ορίζει τα ελάχιστα και μέγιστα μεγέθη εργασίας για τη συγκεκριμένη διαδικασία.
Αυτό το API προορίζεται να επιτρέψει τη ρύθμιση χαμηλού επιπέδου των ορίων ελάχιστης και μέγιστης μνήμης για το χώρο χρήσης της μνήμης της διαδικασίας. Έχει, ωστόσο, μια μικρή ιδιορρυθμία ενσωματωμένη σε αυτό που είναι πιο τυχερή.
Εάν και οι δύο ελάχιστες και οι μέγιστες τιμές έχουν οριστεί σε $ FFFFFFFF, τότε το API θα μειώσει προσωρινά το μέγεθος που έχει οριστεί σε 0, αλλάζοντας το από τη μνήμη και αμέσως μόλις το αναπηδά πίσω στη μνήμη RAM, θα έχει το γυμνό ελάχιστο ποσό μνήμης που του έχει διατεθεί (αυτό συμβαίνει όλα μέσα σε λίγα νανοδευτερόλεπτα, οπότε στον χρήστη πρέπει να είναι ανεπαίσθητος).
Μια κλήση σε αυτό το API θα γίνεται μόνο σε συγκεκριμένα χρονικά διαστήματα - όχι συνεχώς, οπότε δεν θα πρέπει να υπάρχει καθόλου επίπτωση στην απόδοση.
Τώρα, ελέγξτε περιοδικά την τελευταία μέτρηση των τραπεζοειδών με "Τώρα" και αν η διαφορά μεταξύ των δύο είναι μεγαλύτερη από την περίοδο που θεωρείται ασφαλής περίοδος αδράνειας, κόψτε τη μνήμη.
Τώρα αποφασίστε ποια χρονική περίοδο θα θεωρήσετε ότι το πρόγραμμα είναι αδρανές. Αποφασίσαμε για δύο λεπτά στην περίπτωσή μου, αλλά μπορείτε να επιλέξετε οποιαδήποτε περίοδο θέλετε, ανάλογα με τις περιστάσεις.
Η προσαρμογή αυτής της μεθόδου για μεγάλους χρόνους επεξεργασίας ή διαδικασίες κατά παρτίδες είναι αρκετά απλή. Κανονικά θα έχετε μια καλή ιδέα για το πού θα ξεκινήσει μια μακρά διαδικασία (π.χ. αρχή της ανάγνωσης βρόχου μέσω εκατομμυρίων αρχείων βάσης δεδομένων) και πού θα τελειώσει (τέλος του βρόχου ανάγνωσης βάσης δεδομένων).
Απλά απενεργοποιήστε το χρονόμετρο σας στην αρχή της διαδικασίας και ενεργοποιήστε το ξανά στο τέλος της διαδικασίας.