2009-03-11 3 views
18

문자열을 파싱하려면 PHP 코드를 작성하고 있습니다. 가능한 한 빨리해야하므로 정규 표현식을 사용할 수 있습니까? 나는 PHP 문자열 함수가 더 비싸다는 것을 직감했다. 그러나 그것은 단지 추측이다. 진실은 뭐니? 무엇을 버리고,PHP에서 더 효율적인 PHP 문자열 함수 또는 정규식은 무엇입니까?

잡아 (문자열 "000000"의 세 번째 위치에 따라) 상반기와 다음 20 바이트에 해시를 비교 왼쪽 : 여기

내가 문자열로 무엇을해야하는지 구체적이다 .

9 번째 바이트부터 다음 "000000"까지의 데이터를 하나의 데이터로 파싱합니다. 그 다음에 다음 19 바이트를 가져 와서 8 (토스 1)과 8로 나눕니다. 그런 다음 두 개의 8 바이트 문자열을 날짜로 변환하는 다른 작업을 수행합니다.

그래서 내가해야 할 일입니다.

답변

16

당신의 경우에 따라 달라집니다 : 문자열을 검색하고, 하위 문자열을 다른 것으로 바꾸는 등의 기본적인 작업을 수행하려는 경우 일반적인 문자열 기능이 필요합니다. 좀 더 복잡한 작업 (예 : IP 주소 검색)을 원한다면 Regex 함수가 더 나은 선택입니다.

정규 표현식을 프로파일 링하지 않았으므로 런타임에서 더 빠를 것이라고 말할 수는 없지만 기본 기능을 사용하여 동등한 해킹을 수행하는 데 소요되는 추가 시간은 가치가 없다고 말할 수 있습니다. 영업의 새로운 정보


편집 :

그것은 당신이 실제로 여기에 작은 문자열 작업의 숫자를해야 할 것처럼 들린다. 각각 개별적으로 매우 기본적이고, 정규식을 사용하여 한 번에 모든 단계 (또는 그 단계 몇 개)를 수행 할 수 있을지 의심 스럽습니다. 기본 함수를 사용합니다.

("000000"부분 문자열의 세 번째 위치를 기준으로) 첫 번째 절반을 가져 와서 해시를 다음 20 바이트와 비교하여 남은 항목을 버립니다.

사용 : strpos()substr()
또는 : /$(.*?0{6}.*?0{6}.*?)0{6}/

그리고 그 이후 다음 19 바이트를 잡아와 분할 8에 (던져 1)과 8

사용하는 것이 : substr() - (여기서 17 바이트를 의미하는 것으로 가정합니다 - 8 + 1 + 8)

$part1 = substr($myStr, $currPos, 8); 
$part2 = substr($myStr, $currPos + 9, 8); 
+1

정규 표현식은 놀라 울 수 있습니다 난 그냥이 증거로 터미널에서했던 것을, 작은 테스트를 보여주고 싶었다 실력 있는. 일반적으로 기본 도구로 사용하는 것을 두려워해서는 안됩니다. – troelskn

+1

@troelskn 그러나 php의 문서는 정규식 엔진을 사용하지 않기 때문에 대부분의 기본 연산에 대한 기본 PHP 함수보다 일반적으로 느리다는 점을 언급하고 있습니다. – T0xicCode

1

네이티브 문자열 기능이 훨씬 빠릅니다. regexp의 이점은 당신이 그들과 함께 할 수있는 일이 거의 없다는 것입니다.

6

정규 표현식이 PHP 문자열 함수 호출보다 빠르다는 임계 값이 있다고 생각합니다. 어쨌든, 당신이하는 일에 많이 의존합니다. 균형을 찾아야합니다.

이제 질문을 편집했습니다. 나는 당신이 성취하려는 것을 위해 문자열 함수를 사용할 것이다. strpos()와 substr()은 언뜻보기에 떠오르는 것입니다.

6

나는 최상의 성능을 원한다면 노력을 최소화하는 데 도움이되는 정규 표현식을 피해야하지만 특정 문제에 대해 거의 언제나 문자열 루틴을 사용하여 코드를 조정하고 큰 성능을 얻을 수 있으므로 최상의 성능을 내지 못합니다 그것의 밀어 올림. 그러나 많은 부분을 최적화 할 수없는 단순한 파싱 루틴에서는 regex가 큰 차이를 만들지 않으므로 여전히 정규식을 사용할 수 있습니다.

편집 : 당신이 게시 한이 특정 문제에 대해 나는 문자열 연산을 선호하지만, 정규식에서 그것을 수행하는 방법을 모르기 때문에. 이것은 꽤 똑바로 앞으로 해시를 제외하고, 그래서 정규식/문자열 함수가 큰 차이를 만들지 않을 것 같습니다.

0

귀하의 필요에 따라 다릅니다. 대부분의 정규 표현식 연산은 생각하는 것보다 빠르며 사소한 연산에서 내장 문자열 함수를 능가 할 수 있습니다. 참고로 저는 preg 라이브러리를 염두에두고 있습니다. 아주 느린 builtin regex 라이브러리가 아닙니다.

4

여러분이하고있는 일이 문자열 함수를 사용하는 것이 합리적이라면, 그것을 사용해야합니다. 마찬가지로 'abc'이라는 상수 문자열이 $value에 있는지 확인하는 경우 strpos($value, 'abc') !== false이 아닌 preg_match('/abc/', $value)을 확인하고 싶습니다. 하지만 문자열 변환과 변환을 많이하면 정규식으로 수행 할 작업을 수행 할 수 있지만 성능과 유지 관리 기능이 모두 손상 될 가능성은 거의 확실합니다.

속도에 대해 염려 할 때, 생각할 때 그것에 대해 생각하지 말고 시계하십시오. time 명령은 친구입니다.

4

일반적으로 문자열 함수는 더 빠르며 정규식 함수는보다 유연합니다.

다른 것들과 마찬가지로 결과가 다를 수 있습니다. 확실히 알 수있는 유일한 방법은 두 가지 방법과 벤치마킹을 시도하는 것입니다.

2

나는 모두 동의한다 : 문자열 함수는 정규 표현식 함수보다 약간 더 성능이 좋다.

strpos() :

$ time php -r '$i = 0; while($i++ < 1000000) strpos("abc", "a");' 

real 0m0.380s 
user 0m0.368s 
sys 0m0.008s 

는 preg_match() :

$ time php -r '$i = 0; while($i++ < 1000000) preg_match("/abc/", "a");' 

real 0m0.441s 
user 0m0.432s 
sys 0m0.004s 
관련 문제