2012-08-10 2 views
2

저는 ActiveRecord 시스템이있는 PHP 프레임 워크를 사용하고 있습니다. ActiveRecord를 사용하여 많은 메모리를 사용하고 복잡한 쿼리에 대해 실행 시간이 길어서 큰 결과를 얻지 못했습니다.실행 시간과 메모리 사용량이 PHP 관련 성능 지표입니까? CPU는 어떻습니까?

내 참조 페이지 (10,000 개의 개체가있는 배열을 생성하는 스크립트)에서 메모리 소비를 100MB 이상 ~ 15MB로 줄이고 실행 시간을 5 초에서 ~ 1.5 초로 줄였습니다.

이 두 측정 만 고려해야합니까? 아니면 PHP를 통해 나와 다른 메트릭을 사용해야합니까?

객체 변수를 저장하는 함수를 변경하여 대부분의 개선 사항을 달성했습니다. 따라서 CPU에 대한 걱정입니다. 로컬 호스트에서의 테스트가 CPU 부족이 아니기 때문입니다. 그러나 실제 환경에서는 다른 요청 때문에 CPU가 지속적으로 사용됩니다. 그러나 PHP에서 CPU 소비를 측정하는 방법은 무엇입니까?

예 : 활성 레코드가 인스턴스화 될 때마다 필드, 규칙 및 관계가 각 개체 인스턴스의 개인 속성에 설정되었습니다. 필자는 이것을 객체 속성 대신 항상 컴파일하고 반환하는 함수로 변경했습니다.

는 않는 메모리 보자

class Record { 
    function __construct() { 
    // Drop the setter methods. Let the CPU work when using the getters. 
    } 
    private function getRelations() { 
    // This process of getting predefined relations, checking for correct data, 
    // and some other calculations is done once, on every getFields() 
    // This costs CPU! 
    return $relations; 
    } 
    private function getFields() { 
    // This process of getting predefined fields, checking for correct data, 
    // and some other calculations is done once, on every getFields() 
    // This costs CPU! 
    return $fields; 
    } 
} 

내 두 가지 질문은 다음과 같습니다 :

  1. 무엇이 더

    class Record { 
        private $relations; 
        private $fields; 
        function __construct() { 
        $this->setRelations(); 
        $this->setFields(); 
        } 
        private function setRelations() { 
        // This process of getting predefined relations, checking for correct data, 
        // and some other calculations is done once, on every construct. 
        // The result is stored in $this->relations; 
        // This costs memory! 
        } 
        private function setFields() { 
        // This process of getting predefined fields, checking for correct data, 
        // and some other calculations is done once, on every construct. 
        // The result is stored in $this->fields; 
        // This costs memory! 
        } 
        private function getRelations() { 
        // This is fast. Loading the set relations from memory. 
        return $this->relations; 
        } 
        private function getFields() { 
        // This is fast. Loading the set relations from memory. 
        return $this->fields; 
        } 
    } 
    

    CPU를하자 그것을 할 ?

  2. 어떻게하면 CPU 소비를 측정 할 수 있습니까?
+0

어쨌든 퍼포먼스에 관심이있는 분들은 ActiveRecord ORM을 사용해야합니다.신속한 프로토 타이핑에 적합하지만 성능이 크게 향상되고 일반적으로 고부하 응용 프로그램에서 실수가 발생합니다. Gateways와 DataMappers를 살펴 보는 것이 좋습니다. – rdlowrey

답변

1

귀하의 데이터베이스는 매우 중요합니다. 색인이 제대로 작성되었는지 확인하십시오. 최악의 시나리오에서 검사되는 행 수를 확인하려면 쿼리 프로파일 링을 수행하십시오. 10 번 중 9 번은 성능 문제를 일으키는 DB가 아니라 코드입니다.

1

아마도 CPU가 수행하는 다른 작업과 프로세스가 차단되는지 여부에 따라 영향을받을 벽시계 시간으로 실행 시간을 측정하고있을 것입니다. 예를 들어 데이터베이스 호출을 할 때 벽 시계는 CPU가 유휴 상태 일 때 계속 실행됩니다. 이 유휴 시간은 사용량이 많은 것처럼 보일지라도 다른 요청을 처리하는 데 사용될 수 있습니다.

XHProf과 같은 프로파일 러를 사용하면 응용 프로그램 전체에서 정확한 메모리, CPU 및 벽시계 비용을 측정 할 수 있습니다. 이 함수는 호출 한 다른 함수를 제외하고 각 함수에 대해 소요 된 시간과 메모리를 측정하여 응용 프로그램으로 드릴 다운 할 수 있도록합니다.

더 중요한 것은 시간 또는 메모리로 전체 응용 프로그램 프로필에 따라 다릅니다. 대용량의 메모리를 사용하는 요청이 많은 경우 CPU 사용량을 늘리는 새로운 요청을 수행해야합니다. 반대의 경우도 마찬가지입니다. 또한 짧은 시간 동안 많은 메모리를 사용하는 것이 더 많은 요청을 동시에 처리하려고 할 때 더 중요합니다.

관련 문제