2016-09-12 4 views
0

주어진 파일 시스템의 모든 파일을 일치시킬 수있는 필터를 제공해야합니다.이 필터는 Linux가 아닌 IDE의 모든 파일을 regex 기반 필터링을 지원하는 거대한 코드 기반.모든 파일과 일치하는 필터 표현의 성능 : *. * *. *

*

*를 사용하는 사이에 상당한 성능 차이가있다. *

참고 : 위의 표현에서 여분의 공백을 무시하고 공백없이 게시하면 어떤 이유로 점으로 표시됩니다.

모든 파일에 확장명이 있다고 가정 할 때이 표현식은 하나이며 동일합니다. 그러나, 나는 그것 중 하나가 일치하는 파일의 거대한 수가있을 때 특히 다른 하나를 능가하는지 알고 싶습니다.

+0

'*'는 '아무것도'와 일치 할 수 있습니다. '.'은 최소한 하나의 문자가 있어야합니다. "null"이라는 이름의 파일을 갖는 것은별로 의미가 없지만 모든 파일 시스템에서 합법적이지는 않습니다. 단순한 파일을 작성하면 왜 더 복잡한 패턴을 만들 수 있습니까? –

+0

대부분의 경우, 파일 이름을 찾는 데 시간이 많이 걸립니다. 이자형. I/O 작업에서 와일드 카드와 이름의 일치는 모든 I/O 작업과 비교하여 사실상 0 일 정도로 빠릅니다. 따라서 : 아니오, 관련성있는 성능 차이는 기대하지 마십시오. – Bernhard

+0

나는 내 대답에 위의 코멘트를 아래에 내장. 하나는 다른 하나보다 성능이 뛰어나지 만 둘 다 엄청나게 빠릅니다. – Bernhard

답변

1

성능은 한 정규식 엔진마다 다를 수 있으므로 확실히 말할 수는 없습니다. Bernhard shows in his answer처럼 I/O는 정규식보다 비쌉니다. 당신이 정말로 사용하는 것이

정규식 그러나이 될 것이다 :

.*는 - 0 개 이상의 문자와 문자열을 일치시킵니다.

.*\..*

는 - 0 개 이상의 문자와 문자열 다음에 기간 다음에 0 개 이상의 문자와 문자열을, 일치.

파일 탐색기/브라우저 및 IDE의 정규식 검색 막대에 넣으려는 경우 .*을 사용해야합니다. Marc B가 주석에서 언급했듯이, 더 간단한 것을 선호해야합니다. 다른 이유가 없다면, 이해하기가 더 쉽습니다. 두 번째 것을 발견하면 원래 의도가 무엇인지 궁금 할 것입니다. .*도 특별한 종류이며, 사용중인 정규식 엔진이이를 최적화했을 가능성이 있습니다.

그러나 명령 줄에서 또는 프로그래밍 방식으로 이러한 정규식을 사용하려는 경우주의 깊게 살펴보십시오. 당신이 무슨 일을하는지에 따라 무한 재귀가 발생할 수 있습니다 -

  • . 디렉토리 : .* 리눅스와 맥 OS X에 나쁠 수있는 몇 가지 일을 일치합니다.

  • .. 디렉토리 - 실행중인 기기는 /입니다. 재귀 적 옵션/플래그와 짝을 지었을 경우, 실행중인 모든 것이 파일 시스템 전체에 닿아 있음을 의미합니다.

  • 숨겨진 파일 - 숨겨진 파일은 .

시작 그리고 그건 시작에 불과합니다. 매우 넓은 문자열을 캡처하는 정규 표현식을 사용할 때는주의해야합니다.하지만 내가 말한 것처럼 검색 창에 .*으로 괜찮을 것입니다.

0

나는 정규식의 계산 시간이 거의 항상 파일 시스템을 읽는 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보다 빠릅니다. 글쎄 ...