나는 정규식의 계산 시간이 거의 항상 파일 시스템을 읽는 I/O보다 낮을 것이라고 주장한다. 다음은 정규 표현식의 속도를 보여주는 예제입니다. 일부 소형 데스크탑 i5 @ 3.1Ghz 8MB RAM을 사용 중입니다. 숫자 cruncher 컴퓨터는 아니지만 나쁘지는 않습니다. 많은 사람들이 비슷한 것을 사용할 것입니다. 나는 측정 시간이 쉬운 해석 언어 인 R을 사용하고 있습니다.
이전 DOS 시간과 마찬가지로 8 자로 구성된 1 백만 개의 파일 이름의 무작위 샘플이 3자를 나타냅니다. ". * *"
n <- 1000000
#simulate n filenames of 8 letters dot 3 letters
filenames <- replicate(n, paste0(paste0(sample(LETTERS, 8),collapse=""),
".", paste0(sample(LETTERS, 3), collapse=""), collapse=""))
내가의 자동 번역을 사용하여 다음과 같은 정규식 준 : 코드가 추가 최적화없이
> glob2rx("*.*")
[1] "^.*\\."
을, 나는 시간을내어 동안 모두 100 만 파일 이름을 grepped :
library(microbenchmark)
microbenchmark(
search = grep("^.*\\.",filenames ,value=TRUE))
그리고 이것은 결과입니다
Unit: milliseconds
expr min lq mean median uq max neval
search 368.1657 373.883 392.9093 376.7103 415.4723 477.3519 100
가장 긴 기간은 477 MS였으며, 평균 지속 시간은 393 ms였습니다. 이제 상상해보십시오. 파일 시스템이 1 백만 개의 파일 이름을 읽는 데 얼마나 오래 걸릴지 상상해보십시오.이 파일 이름의 사본을 정규식 제어로 만들려면 해석 언어에서 0.4 초 미만이 소요됩니다.
"*"에 대한 자동 번역은 "^"입니다. 이제 훨씬 빨랐습니다.
Unit: milliseconds
expr min lq mean median uq max neval
search 166.866 167.8187 181.0547 169.0102 171.7741 236.9923 100
2.2 배 빨랐습니다. 그러나 파일 IO 및 GUI가 이러한 양의 데이터를 처리하기를 기다리는 경우, 그러한 작업이 180 ms 또는 400 ms 걸리는지 여부는 신경 쓰지 않습니다. 보다 현실적인 10,000 파일 이름을
, 결과는 그래서 하나의 스타가 밀리 스타 도트 별의 번역에서의 평가
Unit: milliseconds
expr min lq mean median uq max neval
star 0.840248 0.844221 0.8615701 0.847531 0.867064 1.383529 1000
stardotstar 2.702499 2.709452 2.7827241 2.751498 2.787914 12.248153 1000
미만 3 밀리 초 단위로 평가되고있다 . 그것은 단일 항성에 대한 계수 3.1보다 빠릅니다. 글쎄 ...
'*'는 '아무것도'와 일치 할 수 있습니다. '.'은 최소한 하나의 문자가 있어야합니다. "null"이라는 이름의 파일을 갖는 것은별로 의미가 없지만 모든 파일 시스템에서 합법적이지는 않습니다. 단순한 파일을 작성하면 왜 더 복잡한 패턴을 만들 수 있습니까? –
대부분의 경우, 파일 이름을 찾는 데 시간이 많이 걸립니다. 이자형. I/O 작업에서 와일드 카드와 이름의 일치는 모든 I/O 작업과 비교하여 사실상 0 일 정도로 빠릅니다. 따라서 : 아니오, 관련성있는 성능 차이는 기대하지 마십시오. – Bernhard
나는 내 대답에 위의 코멘트를 아래에 내장. 하나는 다른 하나보다 성능이 뛰어나지 만 둘 다 엄청나게 빠릅니다. – Bernhard