바 이 두 엔지니어 가 PHP 함수 의 실현 원리 와 성능 분석(1)

머리말
모든 언어 에서 함 수 는 가장 기본 적 인 구성 단원 이다.php 의 함수 에 대해 그것 은 어떤 특징 을 가지 고 있 습 니까?함수 호출 은 어떻게 실현 되 었 습 니까?php 함수 의 성능 이 어 떻 습 니까?어떤 사용 제안 이 있 습 니까?본 고 는 원리 에서 출발 하여 실제 성능 테스트 와 결합 하여 이 문제 들 에 대해 대답 하고 실현 을 이해 하 는 동시에 phop 프로그램 을 더욱 잘 작성 할 것 이다.또한 흔히 볼 수 있 는 phop 함수 에 대해 서도 소개 합 니 다.
php 함수 의 분류
php 에서 가로로 구분 하면 함 수 는 두 가지 로 나 뉜 다.userfunction(내장 함수)와 internal function(내장 함수)이다.전 자 는 사용자 가 프로그램 에서 사용자 정의 한 함수 와 방법 이 고 후 자 는 php 자체 가 제공 하 는 각종 라 이브 러 리 함수(예 를 들 어 sprintf,arraypush 등.사용자 도 확장 방법 을 통 해 라 이브 러 리 함 수 를 작성 할 수 있 습 니 다.이것 은 뒤에서 소개 합 니 다.user function 에 대해 서 는 function(함수)과 method(클래스 방법)로 세분 화 할 수 있 으 며,본 고 는 이 세 가지 함수 에 대해 각각 분석 하고 테스트 할 것 이다.
php 함수 의 실현
하나의 phop 함수 가 최종 적 으로 어떻게 실 행 됩 니까?이 절 차 는 어떻게 됩 니까?
이 질문 에 대답 하려 면 phop 코드 의 실행 이 거 친 절 차 를 살 펴 보 자.

그림 1 에서 볼 수 있 듯 이 php 는 전형 적 인 동적 언어 실행 과정 을 실현 했다.코드 를 받 은 후에 품사 해석,문법 해석 등 단 계 를 거 친 후에 소스 프로그램 은 하나의 명령(opcodes)으로 번역 되 고 ZEND 가상 기 는 이런 명령 을 순서대로 수행 하여 작업 을 완성 한다.Php 자 체 는 c 로 이 루어 졌 기 때문에 최종 적 으로 호출 된 것 도 모두 c 의 함수 이다.실제로 우 리 는 phop 을 c 가 개발 한 소프트웨어 로 볼 수 있다.위의 설명 을 통 해 알 수 있 듯 이 phop 에서 함수 의 실행 도 opcodes 로 번역 되 어 호출 되 었 고 매번 함수 호출 은 실제 적 으로 하나 이상 의 명령 을 실 행 했 습 니 다.
모든 함수 에 대해 zend 는 다음 과 같은 데이터 구 조 를 통 해 설명 합 니 다.

typedef union _zend_function {
zend_uchar type; /* MUST be the first element of this struct! */
struct {
zend_uchar type; /* never used */
char *function_name;
zend_class_entry *scope;
zend_uint fn_flags;
union _zend_function *prototype;
zend_uint num_args;
zend_uint required_num_args;
zend_arg_info *arg_info;
zend_bool pass_rest_by_reference;
unsigned char return_reference;
} common;

zend_op_array op_array;
zend_internal_function internal_function;
} zend_function;


typedef struct _zend_function_state {
HashTable *function_symbol_table;
zend_function *function;
void *reserved[ZEND_MAX_RESERVED_RESOURCES];
} zend_function_state;

그 중에서 type 은 함수 의 유형 을 표시 했다.사용자 함수,내장 함수,리 셋 함수.Common 에는 함수 이름,매개 변수 정보,함수 표지(일반 함수,정적 방법,추상 적 방법)등 함수 의 기본 정보 가 포함 되 어 있 습 니 다.또한 사용자 함수 에 대해 함수 기호 표 가 하나 더 있 고 내부 변수 등 을 기 록 했 습 니 다.이것 은 뒤에서 상세 하 게 설명 할 것 입 니 다.Zend 전역 function 유지table,이것 은 큰 hahs 표 입 니 다.함수 호출 시 우선 함수 명 에 따라 표 에서 대응 하 는 zend 를 찾 습 니 다.function。함수 호출 을 할 때 가상 기 회 는 type 에 따라 호출 방법 을 결정 하고 서로 다른 유형의 함수 로 그 집행 원 리 는 다르다.
내장 함수
내장 함수,본질 적 으로 진정한 c 함수 입 니 다.모든 내장 함수,phop 은 최종 컴 파일 후 zif 라 는 이름 으로 전 개 됩 니 다.xxxx 의 function,예 를 들 어 우리 가 흔히 볼 수 있 는 sprintf,대응 하 는 끝까지 층 은 zifsprintf。Zend 가 실 행 될 때 내 장 된 함수 가 발견 되면 간단하게 퍼 가기 작업 을 할 수 있 습 니 다.
Zend 는 매개 변수 획득,배열 작업,메모리 배분 등 일련의 api 를 제공 합 니 다.내 장 된 함수 의 매개 변 수 를 가 져 옵 니 다.zend 를 통 해parse_parameters 방법 으로 이 루어 집 니 다.배열,문자열 등 매개 변수 에 대해 zend 는 얕 은 복사 본 을 실현 하기 때문에 이 효율 이 높 습 니 다.이렇게 말 하면 php 내장 함수 에 대해 그 효율 은 상응하는 c 함수 와 거의 같 고 유일 하 게 한 번 더 전송 호출 되 었 다.
내 장 된 함 수 는 php 에서 모두 so 방식 을 통 해 동적 으로 불 러 옵 니 다.사용자 도 필요 에 따라 상응하는 so 를 작성 할 수 있 습 니 다.즉,우리 가 흔히 말 하 는 확장 입 니 다.ZEND 는 확장 사용 을 위 한 일련의 api 를 제공 합 니 다.
사용자 함수
내 장 된 함수 에 비해 사용자 가 phop 을 통 해 이 루어 진 사용자 정의 함 수 는 전혀 다른 실행 과정 과 실현 원 리 를 가지 고 있 습 니 다.앞에서 말 한 바 와 같이 우 리 는 php 코드 가 하나의 opcode 로 번역 되 어 실 행 된 것 을 알 고 있 습 니 다.사용자 함수 도 예외 가 아 닙 니 다.실제 적 으로 모든 함수 가 하나의 opcode 에 대응 하고 이 명령 은 zend 에 저 장 됩 니 다.function 중.따라서 사용자 함수 의 호출 은 최종 적 으로 opcodes 의 실행 에 대응 하 는 것 입 니 다.
>부분 변수의 보존 및 재 귀적 실현
우 리 는 함수 재 귀 는 스 택 을 통 해 이 루어 진 다 는 것 을 안다.php 에서 도 비슷 한 방법 으로 이 루어 진다.Zend 는 모든 phop 함수 에 하나의 활동 기호 표(activesym_table)현재 함수 의 모든 부분 변수의 상 태 를 기록 합 니 다.모든 기호 표 는 스 택 형식 으로 유지 되 고 함수 가 호출 될 때마다 새로운 기호 표를 스 택 에 배정 합 니 다.호출 이 끝 난 후 현재 기호 표 가 스 택 에서 나 옵 니 다.이로써 상태의 보존 과 귀속 을 실현 하 였 다.
창고 의 유지 보수 에 대해 zend 는 여기에서 최 적 화 를 했다.N 길이 의 정적 배열 을 미리 배정 하여 스 택 을 모 의 합 니 다.이러한 정적 배열 을 통 해 동적 데이터 구 조 를 모 의 하 는 기법 은 우리 자신의 프로그램 에서 도 자주 사용 되 는데 이런 방식 은 매번 호출 에 따 른 메모리 배분,소 거 를 피 할 수 있 습 니 다.ZEND 는 함수 호출 이 끝 날 때 현재 스 택 상단 의 기호 표 데 이 터 를 clean 하면 됩 니 다.정적 배열 의 길이 가 N 이기 때문에 함수 호출 차원 이 N 을 초과 하면 프로그램 에 스 택 이 넘 치지 않 습 니 다.이런 상황 에서 zend 는 기호 표 의 분배,소각 을 하기 때문에 성능 이 많이 떨 어 질 수 있 습 니 다.zend 에서 N 은 현재 32 입 니 다.따라서 phop 프로그램 을 작성 할 때 함수 호출 단 계 는 32 를 넘 지 않 는 것 이 좋 습 니 다.물론 웹 응용 이 라면 그 자체 가 함수 호출 차원 의 깊이 를 사용 할 수 있 습 니 다.
>매개 변수의 전달 과 내장 함수 호출 zendparse_params 에서 매개 변 수 를 가 져 오 는 것 과 달리 사용자 함수 에서 매개 변 수 를 가 져 오 는 것 은 명령 을 통 해 이 루어 집 니 다.함수 에 몇 개의 매개 변수 가 있 으 면 몇 개의 명령 에 대응한다.구체 적 으로 실현 하 는 것 은 일반적인 변수 할당 이다.위의 분석 을 통 해 알 수 있 듯 이 내 장 된 함수 에 비해 자체 적 으로 스 택 표를 유지 하고 모든 명령 의 집행 도 c 함수 이기 때문에 사용자 함수 의 성능 이 상대 적 으로 떨 어 지고 그 다음 에 구체 적 인 비교 분석 이 있 을 것 이다.따라서 phop 내 장 된 함수 에 대응 하 는 기능 이 있다 면 스스로 함 수 를 다시 쓰 지 않도록 하 세 요.

좋은 웹페이지 즐겨찾기