Bir dosyanın ilk satırını kaldırmak için sed
vs.'nin performansıtail
TL; DR
sed
çok güçlü ve çok yönlüdür, ancak özellikle çok satırlı büyük dosyalar için onu yavaşlatan şey budur.
tail
sadece tek bir basit şey yapar, ama bunu çok satırlı daha büyük dosyalar için bile iyi ve hızlı yapar.
Küçük ve orta boyutlu dosyalar için sed
ve tail
benzer şekilde hızlı (veya beklentilerinize bağlı olarak yavaş) performans gösteriyorlar. Bununla birlikte, daha büyük giriş dosyaları (çoklu MB'ler) için, performans farkı belirgin tail
şekilde daha iyi performans göstererek önemli ölçüde büyür (yüzlerce MB aralığındaki dosyalar için bir büyüklük sırası) sed
.
Deney
Genel Hazırlıklar:
Analiz etme komutlarımız:
sed '1d' testfile > /dev/null
tail -n +2 testfile > /dev/null
Ben çıkış boru ediyorum unutmayın /dev/null
performans darboğaz olarak, terminal çıkış veya dosya yazar ortadan kaldırmak için her zaman.
Potansiyel darboğaz olarak disk G / Ç'sini ortadan kaldırmak için bir RAM diski ayarlayalım. Şahsen birtmpfs
monte var, /tmp
bu yüzden sadece testfile
bu deney için oraya yerleştirdim .
Sonra bir kez belirtilen miktarda satır içeren rastgele bir test dosyası oluşturuyorum $numoflines
bu komutu kullanarak rastgele çizgi uzunluğu ve rastgele veri ile (kesinlikle optimal olmadığını unutmayın, yaklaşık> 2M hatları için gerçekten yavaş olur, ama kimin umurunda değil, analiz ettiğimiz şey):
cat /dev/urandom | base64 -w0 | tr 'n' '\n'| head -n "$numoflines" > testfile
Oh, btw. test dizüstü bilgisayarım Intel i5-6200U CPU'da Ubuntu 16.04, 64 bit çalıştırıyor. Sadece karşılaştırma için.
Büyük dosyaların zamanlaması:
Devasa bir kurulum testfile
:
Yukarıdaki komutu numoflines=10000000
10M satırları içeren rastgele bir dosya üretti, 600 MB'tan biraz işgal etti - oldukça büyük, ancak başlayalım, çünkü şunları yapabiliriz:
$ wc -l testfile
10000000 testfile
$ du -h testfile
611M testfile
$ head -n 3 testfile
qOWrzWppWJxx0e59o2uuvkrfjQbzos8Z0RWcCQPMGFPueRKqoy1mpgjHcSgtsRXLrZ8S4CU8w6O6pxkKa3JbJD7QNyiHb4o95TSKkdTBYs8uUOCRKPu6BbvG
NklpTCRzUgZK
O/lcQwmJXl1CGr5vQAbpM7TRNkx6XusYrO
Zamanlamalı koşuyu büyük testfile
:
Şimdi ne büyüklükte çalıştığımızı tahmin etmek için önce her iki komutla da tek bir zamanlı çalışma yapalım.
$ time sed '1d' testfile > /dev/null
real 0m2.104s
user 0m1.944s
sys 0m0.156s
$ time tail -n +2 testfile > /dev/null
real 0m0.181s
user 0m0.044s
sys 0m0.132s
Büyük dosyalar için zaten çok net bir sonuç görüyoruz, tail
daha hızlı bir büyüklük sed
. Ancak sadece eğlence için ve büyük bir fark yaratan rastgele bir yan etki olmadığından emin olmak için, 100 kez yapalım:
$ time for i in {1..100}; do sed '1d' testfile > /dev/null; done
real 3m36.756s
user 3m19.756s
sys 0m15.792s
$ time for i in {1..100}; do tail -n +2 testfile > /dev/null; done
real 0m14.573s
user 0m1.876s
sys 0m12.420s
Sonuç aynı kalır, sed
büyük bir dosyanın ilk satırını kaldırmak için yetersiz, tail
orada kullanılmalıdır.
Ve evet, Bash'ın döngü yapılarının yavaş olduğunu biliyorum, ancak burada sadece nispeten az sayıda yineleme yapıyoruz ve düz bir döngünün aldığı zaman, sed
/tail
runtimes'a .
Küçük dosyaların zamanlaması:
Küçük bir kurulum testfile
:
Şimdi tamlık için, kB aralığında küçük bir giriş dosyanız olduğu daha yaygın olan duruma bakalım. Şu şekilde numoflines=100
görünen rastgele bir girdi dosyası oluşturalım :
$ wc -l testfile
100 testfile
$ du -h testfile
8,0K testfile
$ head -n 3 testfile
tYMWxhi7GqV0DjWd
pemd0y3NgfBK4G4ho/
aItY/8crld2tZvsU5ly
Zamanlı çalışmayı küçük testfile
:
Bu tür küçük dosyaların zamanlamalarının deneyimden birkaç milisaniye aralığında olmasını beklediğimizden, hemen 1000 yineleme yapalım:
$ time for i in {1..1000}; do sed '1d' testfile > /dev/null; done
real 0m7.811s
user 0m0.412s
sys 0m7.020s
$ time for i in {1..1000}; do tail -n +2 testfile > /dev/null; done
real 0m7.485s
user 0m0.292s
sys 0m6.020s
Gördüğünüz gibi, zamanlamalar oldukça benzer, yorumlanacak veya merak edilecek çok şey yok. Küçük dosyalar için, her iki araç da eşit derecede uygundur.
sed
daha taşınabilir olmasıdır:tail
GNU kullanantail
ancak BSD üzerinde çalışmayan Ubuntu üzerinde iyi çalışmalar için "+2"tail
.