2010-05-19 13 views
2

PHP에서 위의 extract 함수에 대해 알아 냈습니다. 정말 편리하다고 생각합니다. 그러나 나는 PHP에서 좋은 대부분의 것들이 또한 성능에 영향을 미친다는 것을 배웠다. 나의 질문은 성능에 대한 관점에서 보았을 때 extract을 사용할 때의 영향이다.배열에서 변수를 추출하는 것이 성능에 좋지 않습니까?

큰 응용 프로그램에서 변수를 추출하는 데 사용할 수 있습니까?

+1

이것은 실제로 어떻게 사용하고 있는지에 따라 다릅니다. 코드 샘플주세요. – Josh

답변

2

업데이트 중 : 사용하는 이유를 발견 적이 :주의 아래의 주석으로

을 나는 잘 알고 년이 지난 지금 나처럼 - 쓰기에 사본입니다 PHP 변수를 . 그러나 전역 범위 에서 추출하는 것은이지만 변수가 가비지 수집되지 않도록하십시오. 내가 전에 말했듯이 그래서,


배열의 크기와 그것을 추출되는 범위에 따라 달라집니다 "당신의 범위를 고려"전역 네임 스페이스에 거대한 배열을 추출 할 말을, 내가 가진 것을 볼 수 있었다 이 PHP가 제한 할 것으로 알려져있다 재미있는 내부 물건을 할 수 있지만 내가 믿는 - - 두 번 메모리에 모든 데이터를 것 같은 효과

을하지만

function bob(){ 
    extract(array('a' => 'woo', 'b' =>'fun', 'c' => 'array')); 
} 

했던 말은 진정한 지속 효과는 없을 것입니다.

간단히 말하자면, 당신이하고있는 일, 왜 그것을하고 있는지, 범위를 고려하십시오.

+1

PHP 변수가 copy-on-write를 가져 오지만 둘 이상 존재해야 할 이유가 없습니다 한 번 추출한 후에 메모리에 저장하거나 값 자체에 복사가 필요합니다. 이것을 테스트 했습니까? 아니면 가정입니까? – thomasrutter

2

extract은 신뢰할 수없는 데이터에 사용하면 안됩니다. 일반적으로 신뢰할 수있는 데이터에는 유용하지 않습니다 (알려진 배열 키 수가 제한되어 있기 때문에).

0

컴파일러 및/또는 인터프리터에서 SIMD 명령어를 사용할 수 있으므로 대부분의 언어로 배열을 사용하는 것이 훨씬 좋습니다.

또한 코드의 일부가 배열 내의 각 값에 대해 하나의 함수를 호출하려고 시도 할 수 있습니다. 퍼포먼스 관점에서 볼 때, 모든 값을 묶어 한 번만 함수를 호출하는 것이 더 효율적입니다. 함수가 여러 번 호출되는 오버 헤드는 배열이 너무 길어 가능한 최적화를 감지하기가 어려워 짐에 따라 조정됩니다.

+2

'extract'는 주로 연관 배열을위한 것이지 숫자로 색인 된 것들은 아닙니다. 그래서 나는 SIMD가 적용된다고 생각하지 않는다. –

+0

@Matthew 연관 배열을 사용하는 경우에도 각 루프 유형에 대해 SIMD를 사용하면 여러 가지 키를 동시에 사용할 수 있습니다 (여러 키를 동시에 처리 할 수 ​​있음) – SystematicFrank

2

왜 그렇게 큰 성능이 나오지 않는지는 알 수 없습니다. 큰 루프에서 거대한 배열을 추출합니다. 는하지만 추출물

0

한 번 충돌하는 스크립트를 디버깅해야했습니다. PHP가 메모리가 부족한 것으로 나타났습니다.

일부 문제는 extract()이 25000 개 요소의 루프에 사용되고 있다는 것입니다. 메모리가 부족하기 전에 약 2300 개 요소 만 통과합니다. 나는 추출물 (4 요소의 연관 배열)을 수동으로 변수를 설정하는 것으로 바꾸 었으며 루프는 약 5200 개의 레코드를 통과 할 수있었습니다.

그래서 extract()에는 확실히 성능 단점이 있습니다.

관련 문제