[Michael Lynch] kohtasi oudon tilanteen. Miksi kääntäminen juoksi silloin hänen ohjelmaansa lähes 10x nopeampi kuin pelkkä ohjelman suorittaminen itsestään? [Michael] törmäsi tähän ongelmaan ohjelmointiprojektin benchmarking-arvioinnissa, paransi sen toistettavuuden ja analyysin oleellisiin asioihin ja huomasi, että se nosti esiin väärän mentaalisen mallin bash-putkien toiminnasta.
Tässä tilanne. Ensimmäinen asia, [Michaelin] parannettu ohjelma tekee, on ajastimen käynnistäminen. Sitten se vain lukee ja laskee joitain tavuja stdin
, tulostaa sitten, kuinka kauan sen tapahtumiseen kului. Kun testiohjelma suoritetaan seuraavalla tavalla, se kestää noin 13 mikrosekuntia.
$ echo '00010203040506070809' | xxd -r -p | zig build run -Doptimize=ReleaseFast bytes: 10 execution time: 13.549µs
Kun (jo käännetty) ohjelma suoritetaan suoraan, suoritusaika paisuu 162 mikrosekuntiin.
$ echo '00010203040506070809' | xxd -r -p | ./zig-out/bin/count-bytes bytes: 10 execution time: 162.195µs
Jälleen ainoa ero zig build run
ja ./zig-out/bin/count-bytes
on se, että ensimmäinen kääntää koodin ja suorittaa sen sitten välittömästi. Toinen yksinkertaisesti suorittaa käännetyn ohjelman.
Kuinka voidaan lisätä ylimääräinen käännösvaihe vähentää toteutusaika? Osoittautuu, että [Michaelin] mentaalinen malli bash-putkien toiminnasta oli virheellinen, ja hän tekee hienoa työtä selittää, kuinka ne todella toimivat ja miksi se aiheutti oudon käytöksen hän näki.
Lyhyesti sanottuna bash-liukuhihnan komentoja ei käynnistetä peräkkäin. Ne kaikki käynnistetään samanaikaisesti ja suoritetaan rinnakkain. Tämä tarkoitti, että kun suoritettiin suoraan, [Michaelin] tavulaskuriohjelma käynnistyi välittömästi. Sitten se odotti tekemättä mitään noin 150 mikrosekuntia echo '00010203040506070809' | xxd -r -p
osa putkistosta päätyi toimittamaan tietonsa ohjelman luettavaksi. Tästä tulee ylimääräinen suoritusaika, kun jo käännetty versio suoritetaan.
Joten miksi sen kääntäminen toimii ensin nopeammin? Sama perussyy: kun zig build run
komento käynnistyy, se käyttää vähän aikaa ohjelman kääntämiseen ensin. Sitten kun käännetty ohjelma todella käynnistetään (ja käynnistää sen suoritusajastimen), bash-putken syöttötiedot ovat jo valmiina. Joten juuri käännetty ohjelma suoritetaan lyhyemmässä ajassa, koska se ei jää odottamaan, että aiemmin valmisteilla olevia tietoja tulee saataville.
Se on mielenkiintoinen näkemys siitä, kuinka bash-putkistot todella toimivat konepellin alla, ja olemme iloisia yksityiskohdista, joita [Micheal] laittaa koko matkaan ja selityksiin. Ennemmin tai myöhemmin tämän kaltaiset yksityiskohdat tulevat esiin ja saavat kulmakarvoja kohoamaan, kuten käyttäjä, joka löysi ssh-komentojen välilyöntejä koskevat ongelmalliset reunatapaukset.
- SEO-pohjainen sisällön ja PR-jakelu. Vahvista jo tänään.
- PlatoData.Network Vertical Generatiivinen Ai. Vahvista itseäsi. Pääsy tästä.
- PlatoAiStream. Web3 Intelligence. Tietoa laajennettu. Pääsy tästä.
- PlatoESG. hiili, CleanTech, energia, ympäristö, Aurinko, Jätehuolto. Pääsy tästä.
- PlatonHealth. Biotekniikan ja kliinisten kokeiden älykkyys. Pääsy tästä.
- Lähde: https://hackaday.com/2024/03/28/is-your-mental-model-of-bash-pipelines-wrong/