파일의 첫 번째 줄을 제거하는 것과 sed
비교 한 성능tail
TL; DR
중소 파일의 경우, sed
그리고 tail
(여러분의 기대에 따라, 또는 천천히) 빠른 유사하게 수행된다. 그러나 더 큰 입력 파일 (여러 MB)의 경우 성능 차이가 눈에 띄게 커지고 (수백 MB 범위의 파일의 경우 수십 배) tail
분명히 성능이 뛰어납니다 sed
.
실험
일반적인 준비 사항 :
분석 명령은 다음과 같습니다.
sed '1d' testfile > /dev/null
tail -n +2 testfile > /dev/null
/dev/null
터미널 출력 또는 파일 쓰기를 성능 병목 현상으로 제거 하기 위해 매번 출력을 파이핑하고 있습니다.
잠재적 인 병목 현상으로 디스크 I / O를 제거하기 위해 RAM 디스크를 설정합시다. 나는 개인적으로 tmpfs
탑재되어 있으므로이 실험을 위해 /tmp
단순히 testfile
거기에 배치 했습니다.
그런 다음 $numoflines
이 명령을 사용하여 임의의 줄 길이와 임의의 데이터 가있는 지정된 양의 줄 을 포함하는 임의의 테스트 파일을 한 번 만듭니다 (확실히 최적은 아니며 약 2M 줄 이상에서는 실제로 느려집니다. 그러나 누가 신경 쓰지 않습니까? 우리가 분석하는 것) :
cat /dev/urandom | base64 -w0 | tr 'n' '\n'| head -n "$numoflines" > testfile
아, btw. 내 테스트 랩톱은 Intel i5-6200U CPU에서 Ubuntu 16.04, 64 비트를 실행 중입니다. 비교를 위해.
큰 파일 타이밍 :
거대한 설정 testfile
:
numoflines=10000000
600MB가 넘는 비트를 차지하는 10M 라인을 포함하는 임의의 파일 을 생성하여 위의 명령을 실행하면 상당히 크지 만 시작할 수 있습니다.
$ wc -l testfile
10000000 testfile
$ du -h testfile
611M testfile
$ head -n 3 testfile
qOWrzWppWJxx0e59o2uuvkrfjQbzos8Z0RWcCQPMGFPueRKqoy1mpgjHcSgtsRXLrZ8S4CU8w6O6pxkKa3JbJD7QNyiHb4o95TSKkdTBYs8uUOCRKPu6BbvG
NklpTCRzUgZK
O/lcQwmJXl1CGr5vQAbpM7TRNkx6XusYrO
우리의 거대한 시간 초과 실행을 수행하십시오 testfile
:
이제 두 명령을 사용하여 단일 시간 실행을 수행하여 작업중 인 크기를 추정 해 봅시다.
$ 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
우리는 이미 큰 파일에 대한 정말 명확한 결과가 참조 tail
크기보다 더 빨리이다 sed
. 그러나 재미를 위해 큰 차이를 만드는 임의의 부작용이 없는지 확인하려면 100 번 수행하십시오.
$ 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
결론은 동일하게 유지되며 sed
큰 파일의 첫 번째 줄을 제거하는 것은 비효율적 tail
입니다.
그리고 그렇습니다 .Bash의 루프 구조가 느리다는 것을 알고 있지만 여기서는 반복을 거의 수행하지 않으며 일반 루프가 걸리는 시간은 어쨌든 sed
/ tail
런타임 과 비교하여 중요하지 않습니다 .
작은 파일 타이밍 :
작은 설정 testfile
:
이제 완성도를 높이기 위해 kB 범위에 작은 입력 파일이있는 더 일반적인 경우를 살펴 보겠습니다. 다음 numoflines=100
과 같이 임의의 입력 파일을 만들어 봅시다 :
$ wc -l testfile
100 testfile
$ du -h testfile
8,0K testfile
$ head -n 3 testfile
tYMWxhi7GqV0DjWd
pemd0y3NgfBK4G4ho/
aItY/8crld2tZvsU5ly
우리의 작은 시간에 실행을 실행하십시오 testfile
:
이러한 작은 파일의 타이밍이 경험에서 몇 밀리 초 범위에있을 것으로 예상 할 수 있으므로 즉시 1000 회 반복하십시오.
$ 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
보시다시피, 타이밍은 매우 유사합니다. 해석하거나 궁금해 할 것이 많지 않습니다. 작은 파일의 경우 두 도구가 모두 적합합니다.
sed
이식성이 뛰어나다 는 것 입니다. "+2"tail
는 GNU를 사용하는 우분투에서는tail
잘 작동하지만 BSD에서는 작동하지 않습니다tail
.