Zephyrnet logo

Onko Bash-putkien henkinen mallisi väärä?

Treffi:

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

spot_img

Uusin älykkyys

spot_img