Logotip Zephyrnet

Je vaš miselni model Bash cevovodov napačen?

Datum:

[Michael Lynch] je naletel na čudno situacijo. Zakaj je prevajanje potem izvajalo njegov program skoraj 10x hitreje kot samo izvajanje programa? [Michael] je naletel na to težavo med primerjalno analizo programskega projekta, jo zmanjšal na bistvene elemente za ponovljivost in analizo ter ugotovil, da poudarja napačen miselni model delovanja bash cevovodov.

Tukaj je situacija. Prva stvar, ki jo naredi [Michaelov] skrajšani program, je zagon časovnika. Nato preprosto prebere in prešteje nekaj bajtov stdin, nato pa natisne, koliko časa je trajalo, da se je to zgodilo. Pri izvajanju testnega programa na naslednji način traja približno 13 mikrosekund.

$ echo '00010203040506070809' | xxd -r -p | zig build run -Doptimize=ReleaseFast
bytes: 10
execution time: 13.549µs

Pri neposrednem zagonu (že prevedenega) programa se čas izvajanja poveča na 162 mikrosekund.

$ echo '00010203040506070809' | xxd -r -p | ./zig-out/bin/count-bytes
bytes: 10
execution time: 162.195µs

Spet edina razlika med zig build run in ./zig-out/bin/count-bytes je, da najprej prevede kodo, nato pa jo takoj zažene. Drugi preprosto zažene prevedeni program.

Kako lahko dodate dodaten korak prevajanja zmanjša čas izvedbe? Izkazalo se je, da [Michaelov] miselni model delovanja bash cevovodov ni bil pravilen, in odlično opravlja svoje delo pojasnjuje, kako dejansko delujejo in zakaj je to povzročilo čudno vedenje je videl.

Skratka, ukazi v cevovodu bash se ne zaženejo zaporedno. Vsi se zaženejo hkrati in se izvajajo vzporedno. To je pomenilo, da se je [Michaelov] program za števec bajtov takoj zagnal ob neposrednem zagonu. Nato je približno 150 mikrosekund čakal naokrog in ni naredil ničesar, medtem ko je echo '00010203040506070809' | xxd -r -p del cevovoda se je lotil dostave svojih podatkov za branje programa. Od tod izvira dodatni čas izvajanja pri izvajanju že prevedene različice.

Zakaj torej prvo prevajanje teče hitreje? Isti osnovni razlog: ko zig build run ukaz začne, porabi nekaj časa za prevajanje programa. Potem, ko se prevedeni program dejansko zažene (in začne svoj časovnik izvajanja), so vhodni podatki iz cevovoda bash že pripravljeni. Sveže prevedeni program se torej izvede v krajšem času, ker ne sedi in čaka, da postanejo na voljo podatki iz prejšnjega dela.

To je zanimiv pogled na to, kako bash cevovodi dejansko delujejo pod pokrovom, in navdušeni smo nad podrobnostmi, ki jih [Micheal] vključi v celotno pot in razlago. Prej ali slej se pojavijo podrobnosti, kot je ta, in povzročijo dvig obrvi, kot uporabnik, ki je odkril problematični robni primeri glede presledkov v ukazih ssh.

spot_img

Najnovejša inteligenca

spot_img