때 grep
또는 sed
옵션과 함께 사용 --extended-regexp
하고 패턴이 {1,9999}
사용되는 정규 표현식의 일부입니다,이 명령의 성능이 낮은된다. 좀 더 명확하게하기 위해, 몇 가지 테스트가 적용되었습니다. [1] [2]
- 상대의 성능
grep -E
,egrep
및은sed -E
으로 만들어진 때문에 시험 만, 거의 동일grep -E
제공된다.
시험 1
$ time grep -E '[0-9]{1,99}' < /dev/null
real 0m0.002s
시험 2
$ time grep -E '[0-9]{1,9999}' < /dev/null
> real 0m0.494s
시험 3
$ 시간 grep -E '[0123456789] {1,9999}'</ dev / null > 실제 21m43.947s
시험 4
$ time grep -E '[0123456789]+' < /dev/null
$ time grep -E '[0123456789]*' < /dev/null
$ time grep -E '[0123456789]{1,}' < /dev/null
$ time grep -P '[0123456789]{1,9999}' < /dev/null
real 0m0.002s
이 성능 차이가 큰 이유는 무엇입니까?
입력은 중요하지 않습니다. @steeldriver가 제안했듯이 속도 저하 가 일치합니다. 더 간단한 테스트는
—
Eliah Kagan
time grep -E '[0-9]{1,99}' </dev/null
대 time grep -E '[0-9]{1,9999}' </dev/null
. 입력이 없더라도 두 번째 명령은 느립니다 (16.04에서). 예상대로, 생략 -E
및 탈출 {
과 }
동일한으로 동작 및 교체 -E
와하면 -P
(PCRE 다른 엔진) 느린 아니다. 가장 흥미로운 얼마나 많이 빨리 [0-9]
보다 .
, x
심지어 [0123456789]
. 그 중 하나와 함께 {1,9999}
, grep
RAM의 엄청난 금액을 소비; 나는 ~ 10 분 이상 감히하지 않았다.
@ 아니 αғsнιη의가
—
Eliah Kagan
{
}
있다 '
'
인용 ; 쉘은 변경되지 않은 채로 전달합니다 grep
. 어쨌든 {1,9999}
매우 빠르고 간단한 괄호 확장 이 될 것 입니다. 쉘은 단지 확장 할 것이다 1 9999
.
@ αғsнιη 나는 당신이 무엇을 의미하는지 잘 모르지만, 이것은 분명히 껍질과 관련이 없습니다. 오래 실행되는 명령 중에 예상 인수가 전달되었고 사용 하지 않았는지 확인
—
Eliah Kagan
ps
하고 사용하는 데 많은 RAM과 CPU가 소비 top
되는지 확인 grep
했습니다 bash
. BRE / ERE 일치를 위해 libc 로 구현 된 POSIX 정규식 함수를 기대 grep
하고 sed
있습니다 . 개발자가 해당 라이브러리를 사용하기로 선택한 경우를 제외하고 는 디자인 에 대해 구체적으로 이야기해서는 안됩니다 . grep
grep
테스트를로 대체하여
—
muru
time grep ... < /dev/null
사람들이 실제 문제를 grep
다른 데이터와 관련된 데이터와 혼동하지 않도록하는 것이 좋습니다.
[0-9]+
뿐만 아니라)