Λογότυπο Zephyrnet

Είναι λάθος το νοητικό σας μοντέλο των αγωγών Bash;

Ημερομηνία:

Ο [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.

spot_img

Τελευταία Νοημοσύνη

spot_img