ฉันพยายามที่จะเข้าใจว่าการตั้งชื่อไปป์นั้นทำงานอย่างไรเพื่อให้ฉันสามารถปรับปรุงการสื่อสารระหว่างทางแบบทางเดียวได้อย่างคล่องตัว ฉันคาดว่าค่าโสหุ้ยเนื่องจากการคัดลอกข้อมูลลงในบัฟเฟอร์แบบวงกลมซึ่งฉันคิดว่าจะถูกเก็บไว้ใน RAM และดังนั้นฉันจึงคาดว่าท่อจะเร็วกว่าการเขียนไปยังไฟล์มาก (เนื่องจาก RAM มีขนาดของคำสั่งเร็วกว่าดิสก์)
แต่ฉันพบว่าไปป์ที่มีชื่อ (หรือไปป์ที่ไม่ระบุชื่อ) มีความเร็วประมาณเดียวกับไฟล์ นี่เป็นเดสก์ท็อป 3 GHz ที่มีดิสก์ไดรฟ์ทั่วไป (ไม่ใช่โซลิดสเตต) ซึ่งใช้ Ubuntu Linux นี่คือโปรแกรมทดสอบที่เรียบง่ายใน Python:
import sys
import time
import random
megabyte = "".join(random.choice("abcdefghijklmnopqrstuvwxyz") for x in range(1024**2))
while True:
before = time.time()
sys.stdout.write(megabyte)
after = time.time()
sys.stderr.write("{} microseconds\n".format(1e6 * (after - before)))
ท่อตรงไปที่/dev/null
:
python test.py > /dev/null
ให้ผลผลิต 2.1 microseconds (คงที่) สำหรับแต่ละเมกะไบต์
ไปป์ที่ไฟล์:
python test.py > /tmp/testout.txt
ข้ามไปมาระหว่าง 500 microseconds และ 930 microseconds (ค่าที่มากกว่านั้นจะได้รับความสามัญมากกว่าเมื่อไฟล์มีขนาดใหญ่ขึ้น - สมมุติว่ามันกำลังมองหาพื้นที่ดิสก์)
จากนั้นไปป์ที่มีชื่อ:
mkfifo testpipe
cat testpipe > /dev/null &
python test.py > testpipe
ให้ผลผลิต 640 microseconds (ค่าคงที่) และท่อที่ไม่มีชื่อ:
python test.py | cat > /dev/null
ยังให้ผลผลิต 650 microseconds (คงที่)
ใครสามารถอธิบายได้ว่าทำไมความเร็วของไพพ์จึงมากกว่าความเร็วของไฟล์มากกว่า/dev/null
? ฉันอาจมีสวิตช์ที่บอกว่า "เรียกใช้ไพพ์ผ่านบัฟเฟอร์ที่อิงกับไฟล์มากกว่าบัฟเฟอร์ตามแรม" และฉันสามารถเปลี่ยนสวิตช์นั้นได้หรือไม่ มันอาจเป็นตัวเลือกเคอร์เนลหรือตัวแปรเชลล์?
การตีความอื่น: สมมติว่าเอาต์พุตของดิสก์กระโดดระหว่าง 500 และ 930 ไมโครวินาทีเนื่องจาก 500 เป็นเพียงการไพพ์และ 930 นั้นกำลังเขียนจริง จากนั้น 500 ~ 640 สำหรับการวางท่อในทั้งสองกรณีจะเทียบเท่ากัน อย่างไรก็ตามภายใต้การตีความนั้นเหตุใดจึงมีเพียงสองอย่างระหว่างการไพพ์และการเขียนลงดิสก์จริง ๆ เว็บไซต์ที่พูดถึงดิสก์ RAMบอกว่าดิสก์ RAM เร็วกว่าฮาร์ดดิสก์ 50-200 เท่า
/dev/null
จริงๆแล้วการเขียนไปนั้นค่อนข้างถูกในขณะที่เขียนที่อื่นไม่ว่าจะเป็นไฟล์, FIFO, ไพพ์หรืออะไรก็ตาม - มันแพงกว่ามากเพราะมันต้องใช้ความพยายามอย่างมากในการจัดการ