Zephyrnet Logosu

Bash Boru Hatlarına İlişkin Zihinsel Modeliniz Yanlış mı?

Tarih:

[Michael Lynch] tuhaf bir durumla karşılaştı. Neden derleyip programını neredeyse 10 kat çalıştırıyordu? Daha hızlı programı kendi başına çalıştırmaktan başka bir şey mi? [Michael] bir programlama projesini kıyaslarken bu sorunla karşılaştı, onu tekrarlanabilirlik ve analiz açısından temellerine indirgedi ve bash boru hatlarının nasıl çalıştığına dair yanlış bir zihinsel modeli vurguladığını keşfetti.

Durum şu. [Michael]'ın ayrıştırılmış programının yaptığı ilk şey bir zamanlayıcı başlatmaktır. Daha sonra basitçe bazı baytları okur ve sayar. stdin, ardından bunun gerçekleşmesinin ne kadar sürdüğünü yazdırır. Test programını aşağıdaki şekilde çalıştırdığınızda yaklaşık 13 mikrosaniye sürer.

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

(Halihazırda derlenmiş) programı doğrudan çalıştırırken, yürütme süresi 162 mikrosaniyeye yükselir.

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

Yine aradaki tek fark zig build run ve ./zig-out/bin/count-bytes ilk önce kodu derler, sonra hemen çalıştırır. İkincisi sadece derlenmiş programı çalıştırır.

Ekstra bir derleme adımı nasıl eklenir? azaltmak infaz süresi? [Michael]'ın bash boru hatlarının nasıl çalıştığına dair zihinsel modelinin yanlış olduğu ve harika bir iş çıkardığı ortaya çıktı. gerçekte nasıl çalıştıklarını ve bunun neden garip davranışlara neden olduğunu açıklamak görüyordu.

Kısacası, bash boru hattındaki komutlar sırayla başlatılmaz. Hepsi aynı anda başlatılır ve paralel olarak yürütülür. Bu, doğrudan çalıştırıldığında [Michael]'ın bayt sayacı programının hemen başlatıldığı anlamına geliyordu. Daha sonra yaklaşık 150 mikrosaniye boyunca pek bir şey yapmadan bekledi. echo '00010203040506070809' | xxd -r -p Boru hattının bir kısmı, programın okuması için verilerini teslim etmeye başladı. Zaten derlenmiş sürümü çalıştırırken ekstra yürütme süresinin geldiği yer burasıdır.

Peki neden ilk önce derlemek daha hızlı çalışıyor? Aynı temel neden: ne zaman zig build run komutu başladığında, önce programı derlemek biraz zaman alır. Daha sonra derlenen program gerçekten başlatıldığında (ve yürütme zamanlayıcısını başlattığında), bash hattından gelen giriş verileri zaten hazırdır. Böylece, yeni derlenen program daha kısa sürede yürütülür, çünkü daha önce üretim hattındaki verilerin kullanılabilir olmasını beklemez.

Bash boru hatlarının gerçekte nasıl çalıştığına dair ilginç bir bakış ve biz [Micheal]'ın tüm yolculuğa ve açıklamaya kattığı ayrıntılardan çok memnunuz. Er ya da geç, bunun gibi ayrıntılar ortaya çıkar ve keşfeden kullanıcı gibi bazı kaşların kalkmasına neden olur. ssh komutlarındaki boşluklarla ilgili sorunlu uç durumlar.

spot_img

En Son İstihbarat

spot_img