Ο [Michael Lynch] αντιμετώπισε μια περίεργη κατάσταση. Γιατί η μεταγλώττιση τότε έτρεχε το πρόγραμμά του σχεδόν 10x γρηγορότερα από μόνο του να τρέχει το πρόγραμμα; Ο [Michael] αντιμετώπισε αυτό το ζήτημα κατά τη συγκριτική αξιολόγηση ενός έργου προγραμματισμού, το εξέτασε στα βασικά του στοιχεία για επαναληψιμότητα και ανάλυση και ανακάλυψε ότι υπογράμμισε ένα εσφαλμένο νοητικό μοντέλο για το πώς λειτουργούσαν οι αγωγοί bash.
Εδώ είναι η κατάσταση. Το πρώτο πράγμα που κάνει το πρόγραμμα εξομάλυνσης του [Michael] είναι να ξεκινήσει ένα χρονόμετρο. Μετά απλά διαβάζει και μετράει μερικά byte από stdin
, στη συνέχεια εκτυπώνει πόσος χρόνος χρειάστηκε για να συμβεί αυτό. Κατά την εκτέλεση του προγράμματος δοκιμής με τον ακόλουθο τρόπο, χρειάζονται περίπου 13 μικροδευτερόλεπτα.
$ echo '00010203040506070809' | xxd -r -p | zig build run -Doptimize=ReleaseFast bytes: 10 execution time: 13.549µs
Κατά την απευθείας εκτέλεση του (ήδη μεταγλωττισμένου) προγράμματος, ο χρόνος εκτέλεσης αυξάνεται στα 162 μικροδευτερόλεπτα.
$ echo '00010203040506070809' | xxd -r -p | ./zig-out/bin/count-bytes bytes: 10 execution time: 162.195µs
Και πάλι, η μόνη διαφορά μεταξύ zig build run
και ./zig-out/bin/count-bytes
είναι ότι ο πρώτος μεταγλωττίζει τον κώδικα και μετά τον εκτελεί αμέσως. Το δεύτερο απλά εκτελεί το μεταγλωττισμένο πρόγραμμα.
Πώς μπορώ να προσθέσω ένα επιπλέον βήμα μεταγλώττισης μείωση ο χρόνος εκτέλεσης; Αποδεικνύεται ότι το νοητικό μοντέλο του [Michael] για το πώς λειτουργούν οι αγωγοί bash ήταν εσφαλμένο και κάνει εξαιρετική δουλειά εξηγώντας πώς λειτουργούν πραγματικά και γιατί αυτό προκάλεσε την παράξενη συμπεριφορά έβλεπε.
Εν ολίγοις, οι εντολές σε μια διοχέτευση bash δεν εκκινούνται διαδοχικά. Όλα εκκινούνται ταυτόχρονα και εκτελούνται παράλληλα. Αυτό σήμαινε ότι όταν εκτελούνταν απευθείας, το πρόγραμμα του μετρητή byte του [Michael] ξεκίνησε αμέσως. Μετά περίμενε χωρίς να κάνει τίποτα για περίπου 150 μικροδευτερόλεπτα ενώ το echo '00010203040506070809' | xxd -r -p
μέρος του αγωγού έφτασε στην παράδοση των δεδομένων του για ανάγνωση του προγράμματος. Εδώ προέρχεται ο επιπλέον χρόνος εκτέλεσης κατά την εκτέλεση της ήδη μεταγλωττισμένης έκδοσης.
Γιατί λοιπόν η μεταγλώττιση εκτελείται πρώτα πιο γρήγορα; Ίδιος βασικός λόγος: όταν το zig build run
η εντολή ξεκινά, ξοδεύει λίγο χρόνο για να μεταγλωττίσει πρώτα το πρόγραμμα. Στη συνέχεια, όταν εκκινηθεί πραγματικά το μεταγλωττισμένο πρόγραμμα (και ξεκινήσει ο χρονοδιακόπτης εκτέλεσής του), τα δεδομένα εισόδου από τη διοχέτευση bash είναι ήδη έτοιμα. Έτσι, το πρόσφατα μεταγλωττισμένο πρόγραμμα εκτελείται σε λιγότερο χρόνο επειδή δεν κάθεται περιμένοντας να γίνουν διαθέσιμα δεδομένα από παλαιότερες εκδόσεις.
Είναι μια ενδιαφέρουσα ματιά στο πώς λειτουργούν πραγματικά οι αγωγοί bash κάτω από το καπό και είμαστε ενθουσιασμένοι με τη λεπτομέρεια που δίνει ο [Micheal] σε όλο το ταξίδι και την εξήγηση. Αργά ή γρήγορα, λεπτομέρειες όπως αυτή εμφανίζονται και προκαλούν μερικά φρύδια, όπως ο χρήστης που ανακάλυψε ενοχλητικές περιπτώσεις ακμών σχετικά με τα κενά στις εντολές ssh.
- SEO Powered Content & PR Distribution. Ενισχύστε σήμερα.
- PlatoData.Network Vertical Generative Ai. Ενδυναμώστε τον εαυτό σας. Πρόσβαση εδώ.
- PlatoAiStream. Web3 Intelligence. Ενισχύθηκε η γνώση. Πρόσβαση εδώ.
- PlatoESG. Ανθρακας, Cleantech, Ενέργεια, Περιβάλλον, Ηλιακός, Διαχείριση των αποβλήτων. Πρόσβαση εδώ.
- PlatoHealth. Ευφυΐα βιοτεχνολογίας και κλινικών δοκιμών. Πρόσβαση εδώ.
- πηγή: https://hackaday.com/2024/03/28/is-your-mental-model-of-bash-pipelines-wrong/