Εργαστήριο Τεχνολογίας Λογισμικού
+1 vote
237 views

Έστω πως έχουμε το εξής for loop:

for (int i=0; i<N+1; i++) {
    ...
}

Η τιμή του Ν+1 θα υπολογίζεται σε κάθε επαναλήψη; Ή μπορεί ο compiler να κάνει μια βελτιστοποίηση αυτόματα και να το υπολογίσει μόνο μια φορά; (για να μπορέσει να το κάνει αυτό, βέβαια, θα πρέπει να ελέγξει αν το Ν πρόκειται να μεταβληθεί.) Γνωρίζω πως η απάντηση εξαρτάται απο τον compiler που χρησιμοποιώ, οπότε αναφέρομαι στον GCC. Αν και νομίζω γενικά θα με ενδιέφερε να γνωρίζω αν συνηθίζεται στους compilers μια τέτοια βελτιστοποίηση.

Αν επανυπολογίζεται συνέχεια θα ήταν πιο αποδοτικό να ορίσουμε μια νέα μεταβλητή που να βάλουμε μέσα το Ν+1.

Περαιτέρω σκέψεις: Υπάρχει κάποιος τρόπος να δούμε γενικότερα όλες τις βελτιστοποιήσεις που έκανε τελικά ο GCC στο πρόγραμμά μας;

in progintro by (2.9k points)
edited by | 237 views
+1

Φαίνεται πώς (https://godbolt.org/z/ceorMM) ακόμα και με ένα ταπεινό -Ο1, το Ν+1 υπολογίζεται μόνο μια φορα (Γραμμές 7,8).

1 Answer

+2 votes
Best answer

Ίσως κάποια "βελτιστοποίηση" (ουσιαστικά, αποφυγή επανυπολογισμού) να συμβαίνει αν το N έχει δηλωθεί ως const ή είναι defined κατά το pre-compilation (δηλαδή είναι μια σταθερή έκφραση -- επομένως δεν χρειάζεται και υπολογισμό, απλά διάβασμα).

Κατά τα άλλα, αν το Ν είναι μια μεταβλητή, το "όριο" του for loop θα μεταβάλεται σύμφωνα με το expression στο οποίο συμμετέχει το Ν, και το όριο αυτό θα υπολογίζεται κάθε φορά.

Αν γνωρίζεις πως το όριο θα μείνει σταθερό και δεν μεταβάλλεται δυναμικά, είναι καλή πρακτική να σώσεις όπως λες την τιμή (πχ σε μια const μεταβλητή) και να τρέξεις το for loop σύμφωνα με αυτή. Αμφιβάλλω για το αν υπάρχει optimisation pass που κάνει κάτι σαν "tracking" του αν άλλαξε μια μεταβλητή στο σώμα της for ή οχι.

Για να δείς τον κώδικά σου μετά από κάποιο optimisation μπορείς ίσως να ρίξεις μια ματιά στην Assembly που παράγει ο compiler (δεν ξέρω πόσο κατανοητή θα είναι).
Πάντως είμαι σχεδόν σίγουρος πως δεν μπορείς να δείς τον βελτιστοποιημένο κώδικα, καθώς τα optimisation passes γίνονται αφού ο κώδικας μετατραπεί σε AST μορφή (ουσιαστικά δεν είναι κώδικας πλέον -- περισσότερα στους compilers 8ου εξαμήνου).

by (3.0k points)
selected by

301 questions

289 answers

288 comments

910 users