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

유형 방법
클래스 방법 은 실행 원리 와 사용자 함수 가 같 고 opcodes 로 번역 하여 순서대로 호출 합 니 다.클래스 구현,zend 는 하나의 데이터 구조 zendclass_entry 는 클래스 와 관련 된 기본 정 보 를 저장 합 니 다.이 entry 는 php 컴 파일 할 때 이미 처리 되 었 습 니 다.
zend 에서function 의 common 중 한 멤버 는 scope 라 고 하 는데 그 가 가리 키 는 것 은 현재 방법 에 대응 하 는 zend 입 니 다.class_entry。phop 에서 대상 을 대상 으로 하 는 실현 에 대해 서 는 더 상세 한 소 개 를 하지 않 고 앞으로 phop 에서 대상 을 대상 으로 하 는 실현 원 리 를 상세 하 게 서술 할 것 입 니 다.함수 라 는 부분 에 있어 method 실현 원리 와 function 은 완전히 같 고 이론 적 으로 그 성능 도 많 지 않 으 며 그 후에 우 리 는 상세 한 성능 대 비 를 할 것 이다.
성능 대비
함수 이름 길이 가 성능 에 미 치 는 영향
>테스트 방법 은 이름 길이 가 1,2,4,8,16 인 함 수 를 비교 하고 1 초 에 실행 가능 한 횟수 를 비교 하여 함수 명 길이 가 성능 에 미 치 는 영향 을 확인한다.
>테스트 결 과 는 다음 과 같다.
02.jpg
>결과 분석
그림 에서 알 수 있 듯 이 함수 명의 길 이 는 성능 에 어느 정도 영향 을 줄 수 있다.길이 가 1 인 함수 와 길이 가 16 인 빈 함수 호출 은 성능 이 1 배 나 떨어진다.소스 코드 를 분석 하면 원인 을 찾기 어렵 지 않 습 니 다.앞에서 말 한 바 와 같이 함수 가 호출 될 때 zend 는 먼저 전체적인 funtion 에 있 습 니 다.table 에서 함수 명 을 통 해 관련 정 보 를 조회,functiontable 은 해시 시계 입 니 다.필연적으로 이름 이 길 수록 조회 에 걸 리 는 시간 이 많아 진다.따라서 실제 프로그램 을 작성 할 때 여러 번 호출 된 함수 에 대해 서 는 이름 이 너무 길 지 않도록 권장 합 니 다.
함수 명 길이 가 성능 에 어느 정도 영향 을 미 치지 만 구체 적 으로 얼마나 큽 니까?이 문 제 는 실제 상황 과 결합 하여 고려 해 야 한다.만약 에 하나의 함수 자체 가 비교적 복잡 하 다 면 전체적인 성능 에 큰 영향 을 미 치지 않 을 것 이다.하나의 건 의 는 여러 번 호출 되 고 그 자체 의 기능 이 비교적 간단 한 함수 에 대해 간단명료 한 이름 을 적당 하 게 지 을 수 있다 는 것 이다.
함수 개수 가 성능 에 미 치 는 영향
>테스트 방법
다음 세 가지 환경 에서 함수 호출 테스트 를 실시 하고 분석 결과:1.프로그램 은 1 개의 함수 만 포함 합 니 다.2.프로그램 은 100 개의 함 수 를 포함 합 니 다.3.프로그램 은 1000 개의 함 수 를 포함 합 니 다.이 세 가지 상황 에서 1 초 에 호출 할 수 있 는 함수 횟수 를 테스트 합 니 다.
>테스트 결 과 는 다음 과 같다.
03.jpg
>결과 분석
테스트 결 과 를 통 해 알 수 있 듯 이 이 세 가지 상황 에서 성능 이 거의 같 고 함수 개수 가 증가 할 때 성능 이 매우 낮 아 지 므 로 무시 할 수 있다.실현 원리 분석 에서 몇 가지 실현 에서 유일한 차 이 는 함수 가 얻 은 부분 에 있다.앞에서 말 한 바 와 같이 모든 함 수 는 하나의 hash 표 에 놓 여 있 고 서로 다른 숫자 에서 찾 는 효율 은 O(1)에 가 까 워 야 하기 때문에 성능 차이 가 크 지 않다.
유형 별 함수 호출 소모
>테스트 방법
사용자 함수,클래스 방법,정적 방법,내장 함수 각각 을 선택 하고 함수 자 체 는 아무것도 하지 않 고 직접 돌아 가 며 빈 함수 호출 소 모 를 테스트 합 니 다.테스트 결 과 는 초당 실행 가능 횟수 테스트 에서 다른 영향 을 제거 하기 위해 모든 함수 이름 길이 가 같 습 니 다.
>테스트 결 과 는 다음 과 같다.
>결과 분석
테스트 결 과 를 통 해 알 수 있 듯 이 사용자 가 직접 작성 한 phop 함수 에 대해 서 는 어떤 유형 이 든 효율 이 떨 어 지지 않 고 280 w/s 정도 입 니 다.우리 가 예상 한 바 와 같이 에어컨 이라도 내장 함수 의 효율 이 매우 높 고 780 w/s 에 달 하 며 전자 가 3 배 이다.이 를 통 해 알 수 있 듯 이 내 장 된 함수 호출 비용 은 사용자 함수 보다 훨씬 낮다.앞의 원리 분석 을 통 해 알 수 있 듯 이 주요 한 차 이 는 사용자 함수 호출 시 기호 표 초기 화,수신 매개 변수 등 조작 에 있다.
내장 함수 와 사용자 함수 성능 비교
>테스트 방법
내 장 된 함수 와 사용자 함수 의 성능 을 비교 합 니 다.여기 서 우 리 는 자주 사용 하 는 함수 몇 개 를 선택 한 다음 에 phop 으로 같은 기능 을 실현 하 는 함수 로 성능 대 비 를 합 니 다.테스트 에서 우 리 는 문자열,수학,배열 의 각 전형 을 선택 하여 비교 합 니 다.이 몇 가지 함 수 는 문자열 캡 처(substr),10 진법 2 진법(decbin),최소 값(min)과 배열 로 돌아 가 는 것 이기 때문에 key(arraykeys)。
>테스트 결 과 는 다음 과 같다.
30-1.jpg
>결과 분석
테스트 결 과 를 통 해 알 수 있 듯 이 내 장 된 함 수 는 전체 성능 에서 일반 사용자 함수 보다 훨씬 높다.특히 문자열 류 작업 과 관련 된 함수 의 차 이 는 1 개 수량 급 에 이른다.따라서 함수 가 사용 하 는 원칙 은 특정한 기능 에 해당 하 는 내장 함수 가 있 으 면 스스로 phop 함 수 를 만 드 는 것 이 아니 라 사용 하 는 것 입 니 다.대량의 문자열 작업 과 관련 된 기능 에 대해 서 는 성능 을 향상 시 키 기 위해 확장 을 고려 할 수 있 습 니 다.예 를 들 어 흔히 볼 수 있 는 부 텍스트 필터 등 이다.
C 함수 성능 대비
>테스트 방법
우 리 는 문자열 조작 과 산술 연산 을 각각 3 가지 함수 로 비교 하고 phop 는 확장 으로 이 루어 집 니 다.세 가지 함 수 는 간단 한 알고리즘 연산,문자열 비교 와 여러 번 의 알고리즘 연산 이다.자체 의 두 가지 함 수 를 제외 하고 함수 에어컨 소 비 를 제거 한 후의 성능 도 테스트 할 수 있 습 니 다.한편 으로 는 두 가지 함수(c 와 phop 내장)자체 의 성능 차 이 를 비교 해 보 겠 습 니 다.또한 측면 에서 에어컨 함수 의 소모 테스트 점 은 10w 회 작업 을 수행 하 는 시간 소모 입 니 다.
>테스트 결 과 는 다음 과 같다.
30-2.jpg
>결과 분석
내 장 된 함수 와 C 함수 의 씀 씀 이 는 phop 함수 에어컨 의 영향 을 제거 한 후에 차이 가 비교적 적 고 함수 기능 이 점점 복잡 해 지면 서 쌍방의 성능 이 비슷 해 졌 다.이것 은 이전의 함수 실현 분석 에서 도 논증 을 얻 기 쉽다.왜냐하면 내장 함 수 는 C 가 실현 한 것 이기 때문이다.함수 기능 이 복잡 할 수록 c 와 phop 의 성능 차이 가 작 을 수록 c 에 비해 phop 함수 호출 비용 이 많이 들 고 간단 한 함수 에 있어 성능 은 어느 정도 영향 을 미친다.따라서 phop 의 함 수 는 패키지 가 너무 깊 으 면 안 됩 니 다.
의사 함수 및 그 성능
phop 에서 이러한 함수 가 있 습 니 다.그들 은 사용 에 있어 서 표준 적 인 함수 용법 이지 만 바 텀 실현 은 실제 함수 호출 과 완전히 다 릅 니 다.이런 함수 들 은 앞에서 언급 한 세 가지 function 중의 그 어떠한 유형 에 속 하지 않 습 니 다.그 실질 은 단독 적 인 opcode 입 니 다.여기 서 위 함수 나 명령 함수 라 고 평가 합 니 다.
위 에서 말 한 바 와 같이 위 함 수 는 표준 함수 와 다 르 지 않 고 똑 같은 특징 을 가지 고 있 는 것 처럼 보인다.그러나 그들 이 최종 적 으로 실 행 했 을 때 zend 에 의 해 대응 하 는 명령(opcode)으로 호출 되 었 기 때문에 이 는 if,for,산술 연산 등에 더욱 가깝다.
php 의 위조 함수
isset
empty
unset
eval
위의 소 개 를 통 해 알 수 있 듯 이 위 함 수 는 직접 명령 으로 번역 되 어 실행 되 기 때문에 일반 함수 에 비해 함수 호출 에 따 른 비용 이 한 번 적 기 때문에 성능 이 더욱 좋 을 것 이다.우 리 는 아래 의 테스트 를 통 해 대 비 를 한다.Array_key_exists 와 isset 둘 다 배열 의 어떤 key 가 존재 하 는 지 판단 할 수 있 습 니 다.그들의 성능 을 보 세 요.
30-3.jpg
그림 에서 보 듯 이 arraykey_exists 에 비해 isset 성능 이 훨씬 높 고 기본적으로 전자의 4 배 정도 이 며 빈 함수 호출 에 비해 성능 이 1 배 정도 높다.이 를 통 해 phop 함수 호출 비용 이 비교적 크다 는 것 을 측면 에서 입증 했다.

좋은 웹페이지 즐겨찾기