최근 PHP7과 HHVM의 성능 비교가 뜨겁고 논쟁의 여지가 있는 주제가 되었습니다. 어느 쪽이 PHP 성능 향상의 미래인지 모두가 논의하고 주목하고 있습니다.
HHVM은 JIT 컴파일 및 기타 기술을 사용하여 PHP 코드의 실행 성능을 크게 향상시키는 오픈 소스 PHP 가상 머신입니다. 현재 네이티브 PHP 코드 버전의 실행 성능이 5~10배 향상될 수 있다는 소문이 있습니다.
HHVM은 Facebook에서 시작되었습니다. Facebook의 초기 코드 중 상당수는 PHP를 사용하여 개발되었습니다. 그러나 비즈니스의 급속한 발전으로 인해 PHP 실행 효율성이 점점 더 분명해졌습니다. 페이스북은 실행 효율성을 최적화하기 위해 2008년부터 PHP 실행 엔진인 HipHop을 사용하기 시작했습니다. 이는 원래 페이스북의 대용량 PHP 코드를 C++로 변환하여 성능을 향상하고 리소스를 절약할 수 있도록 설계되었습니다. HipHop을 사용한 PHP 코드의 성능이 여러 번 향상되었습니다. 이후 페이스북은 힙합 플랫폼을 오픈소스화해 점차적으로 현재의 HHVM으로 발전시켰다.
1. PHP는 왜 느린가요?
PHP는 C/C++ 수준 언어보다 느립니다. 실제로 PHP 언어는 원래 컴퓨팅 집약적인 응용 프로그램 시나리오를 해결하도록 설계되지 않았습니다. PHP는 개발 효율성을 높이기 위해 실행 효율성을 희생한다는 것을 대략적으로 이해할 수 있습니다.
우리는 PHP의 가장 큰 특징이 약한 유형 기능이라는 것을 알고 있습니다. 즉, 변수를 마음대로 정의한 다음 이를 다양한 유형의 데이터에 마음대로 할당할 수 있다는 것입니다. C 언어에서 int 정수를 예로 들어 보겠습니다.
int num = 200; // 일반적으로 4바이트
그러나 PHP가 동일한 변수를 정의하는 경우 실제 해당 저장 구조는 다음과 같습니다.
이 구조 C 변수보다 훨씬 더 많은 메모리를 차지합니다. PHP의 정의는 다음과 같습니다.
$a = 200; //이 변수는 실제로 C 변수에 비해 몇 배의 저장 공간을 차지합니다.
사실 PHP의 경우 어떤 종류의 데이터를 저장하든 위에서 언급한 "올인원" 구조를 사용하여 구현됩니다. PHP 프로그래머의 변수 유형 "침입"과 호환되기 위해 PHP는 개발자에게는 친절했지만 실행 엔진에는 잔인했습니다. 단일 변수의 메모리 소비는 아직 명확하지 않을 수 있습니다. PHP 배열을 사용하면 복잡성이 기하급수적으로 증가합니다(배열 구현은 HashTable입니다). 그런 다음 Zend 엔진이 실행되면 이러한 PHP 코드는 opcode(PHP의 중간 바이트 코드, 형식이 어셈블리와 다소 유사)로 컴파일되고 Zend 엔진에 의해 한 줄씩 해석되고 실행됩니다.
문자열 연결 작업이든 단순한 배열 수정이든 거의 "PHP 프로그래머의 한마디에 Zend 엔진이 고장난다"는 리듬에 가깝습니다. 따라서 동일한 작업에 대해 PHP는 C보다 CPU, 메모리 등 시스템 리소스를 더 많이 소비합니다. 또한 자동 메모리 재활용, 변수 유형 판단 등이 있어 시스템 리소스 소비가 증가합니다.
예를 들어, 순수 PHP에 구현된 빠른 정렬 기능과 기본 정렬 기능을 사용하여 10,000개의 정수를 정렬하여 비교하는 데 시간이 많이 걸렸습니다.
기본 정렬에 3.44ms가 걸렸습니다. , 그리고 우리가 직접 구현한 PHP 함수 정렬에는 68.79ms가 걸립니다. 우리는 둘 사이의 실행 효율성에 큰 차이가 있음을 발견했습니다. 제가 테스트하는 방법은 전체 PHP 스크립트의 시작부터 끝까지의 시간이 아니라 함수가 실행되기 전후의 시간 간격을 계산하는 것입니다. PHP 스크립트 시작 및 종료 프로세스 자체에는 일련의 초기화 및 정리 작업이 포함되며, 이 작업에도 많은 시간이 소요됩니다.
일반적으로 PHP 실행 효율성 순위는 다음과 같습니다.
일반적인 상황에서는 특히 웹 시스템 트래픽이 상대적으로 큰 시나리오에서 복잡한 논리 계산 기능을 구현하기 위해 PHP를 사용하지 않는 것이 좋습니다. 따라서 PHP 프로그래머는 PHP의 다양한 기본 기능과 다양한 확장에 대해 비교적 폭넓게 이해해야 합니다. 특정 기능 구현 시나리오에서는 이를 구현하기 위해 복잡한 PHP 코드 스택을 직접 작성하는 대신 더 많은 기본 솔루션(기본 인터페이스 또는 확장)을 찾아야 합니다. 기능의 종류.
PHP 확장 개발 기능이 충분하다면 이러한 유형의 비즈니스 기능을 PHP 확장으로 다시 작성하면 코드 실행 효율성도 크게 향상됩니다. 이것은 매우 좋은 방법이며 PHP 최적화에도 널리 사용됩니다. 그러나 자체 작성 PHP 비즈니스 개발의 단점도 분명합니다.
실제로 일선 인터넷 기업들 사이에서는 PHP 확장을 추가하는 것이 아니라 C/C++로 독립적으로 서비스 서버를 작성하고 PHP가 소켓을 통해 서비스 서버와 통신하여 비즈니스 처리를 완료하는 것이 더 일반적인 솔루션입니다. . PHP 자체가 비즈니스와 결합되어 있습니다.
그러나 웹 서비스의 성능 병목 현상의 대부분은 네트워크 전송 및 기타 서비스 서버(예: MySQL 등)의 시간 소모에 있습니다. PHP 실행에 소요되는 시간은 전체 시간 소모에서 매우 작은 부분을 차지합니다. , 따라서 비즈니스 관점에서 보면 그 영향이 명확하지 않을 수 있습니다.
2. HHVM이 PHP 실행 성능을 향상시키는 방법
HHVM이 PHP 성능을 향상시키는 방법은 실행 중에 Zend 엔진을 교체하여 PHP 중간 바이트 코드(HHVM은 자체 형식의 중간 바이트 코드를 생성함)를 생성하는 것입니다. JIT를 통해 실행을 위해 기계어 코드로 변환됩니다. (Just In Time, Just-in-time 컴파일은 소프트웨어 최적화 기술로, 런타임 중에 바이트코드가 기계어 코드로 컴파일된다는 의미입니다.) Zend 엔진의 기본 접근 방식은 먼저 이를 opcode로 컴파일한 다음 하나씩 실행하는 것입니다. 일반적으로 각 명령은 C 언어 수준 함수에 해당합니다. 다수의 반복되는 opcode(순수 PHP로 작성된 코드 및 함수)를 생성하면 Zend는 이러한 C 코드를 하나씩 여러 번 실행합니다. JIT가 하는 일은 한 단계 더 나아가 런타임에 반복적으로 실행되는 다수의 바이트코드를 기계어 코드로 컴파일하여 실행 효율성을 높이는 것입니다. 일반적으로 JIT를 트리거하는 조건은 코드나 함수가 여러 번 호출된다는 것입니다.
일반적인 PHP 코드는 변수의 유형을 고정할 수 없기 때문에 유형을 결정하는 별도의 논리 코드를 추가해야 합니다. 이러한 PHP 코드는 CPU 실행 및 최적화에 도움이 되지 않습니다. 따라서 HHVM은 일반적으로 변수 유형을 수정하고 가상 머신의 컴파일 및 실행을 용이하게 하기 위해 Hack 작성 방법(특정 기능과 호환되도록 추가된 추가 기술 코드)이 포함된 PHP 코드를 "협력"해야 합니다. PHP는 모든 유형을 하나의 형식으로 수용하는 것을 추구하는 반면 Hack은 특정 유형으로 수용되는 모든 것을 표시할 수 있습니다.
PHP 코드 Hack 작성 예:
위 예에서는 PHP 코드에 주로 변수 유형이 추가됩니다. Hack 글쓰기의 전반적인 방향은 기존의 '동적' 글쓰기 방식을 '정적' 글쓰기 방식으로 변경하여 HHVM과 협력하는 것입니다.
HHVM은 높은 성능으로 인해 많은 주목을 받았고, 일부 1차 인터넷 기업들도 이를 따라잡아 사용하기 시작했습니다. 순수 언어 실행 성능 테스트 결과로 볼 때, HHVM은 개발 중인 PHP7 버전보다 훨씬 앞서 있습니다.
그러나 특정 비즈니스 시나리오의 관점에서 보면 HHVM과 PHP7의 격차는 그다지 크지 않습니다. WordPress 오픈 소스 블로그 홈페이지를 사용한 테스트 시나리오의 결과에서는 현재 격차가 뚜렷하지 않습니다.
그러나 PHP7은 아직 개발 중입니다. 사용 가능한 기술 솔루션으로 판단하면 현재 HHVM이 약간 더 좋습니다. 그러나 HHVM의 배포 및 적용에는 몇 가지 문제가 있습니다.
HHVM은 결국 비교적 새로운 오픈소스 프로젝트이고 아직 성숙해지기까지 시간이 좀 걸립니다.
PHP가 오랫동안 비판을 받아온 성능 문제가 이번 버전에서는 대폭 개선되었습니다. 버전 중간에는 PHP6가 없다고 하는데, 이후에는 혼란을 피하기 위해 대부분의 기능이 PHP7로 구현될 예정입니다. . (몇 년 전에는 PHP6 관련 책도 읽었습니다.)
1. PHP7 소개
PHP7 정식 버전은 2015년 10월까지는 나오지 않더라도 내년 6월에는 나올 예정입니다. 테스트 버전을 볼 수 있으며 이후 3~4개월의 품질 보증이 진행됩니다.
PHP 커뮤니티의 프로젝트 계획은 다음과 같습니다.
프로젝트가 아직 개발 중이기 때문에 표에서 볼 수 있는 기능 설명은 비교적 모호합니다. 확실히 더 많은 기능이 있지만 아직 발표되지 않았습니다. 다음은 PHP 커뮤니티에서 가져온 것입니다. PHP7은 개발 중인 프로젝트이므로 정확하지 않을 수 있지만 살펴보는 데 방해가 되는 것은 아닙니다.
위 기능 중 가장 기대되는 것은 PHPng의 성능 최적화입니다. PHP 커뮤니티에서 일부 성능 속도 테스트 데이터를 공개했습니다. 데이터로 볼 때, PHPng의 실행 성능은 프로젝트 초기에 비해 거의 두 배 증가했습니다. 이 결과는 이미 매우 좋습니다. 더욱이 가장 중요한 것은 아직 완료되지 않은 PHP7 최적화 계획이 많다는 것입니다. 모든 것이 완료되면 더 높은 성능의 PHP7을 볼 수 있을 것이라고 믿습니다.
이 속도 테스트 데이터는 PHP 커뮤니티(wiki.php.net/phpng)에서 가져온 것이며 데이터의 일부를 가로채고 있습니다.
현재 PHP5.6 버전의 경우 10월 PHPNG의 성능 개선이 이루어졌습니다. 매우 명백함:
간단한 번역:
2. PHP의 약한 유형 논란
PHP에는 논란의 여지가 많은 기능이 있지만 언어 버전이 출시되고 개선됨에 따라 기능과 특성에 대한 비판이 줄어들기 시작합니다. 그러나 PHP의 "약한 유형" 기능은 분명히 더 논란이 많았습니다. HHVM이 Hack을 통해 "약한 유형" 기능을 직접 "제거"했다는 사실에서 HHVM이 "약한 유형" 기능을 좋아하지 않는다는 것을 알 수 있습니다. 그러나 많은 PHP 프로그래머의 눈에는 이것이 PHP의 중요한 장점 중 하나입니다. PHP의 변수는 모든 것을 포용하면서 캐주얼하고 우아하게 설계되었습니다. 덕분에 언어가 더욱 단순해지지 않나요?
사실 심각한 문제라고 생각하는 사람들도 있습니다. "약한 타이핑"에 대한 비판은 대략 다음과 같습니다.
그들은 이것이 "보이는 대로 얻는다"라는 단순성과 일치하지 않는 반면, 엄격한 문법을 사용하는 언어는 더 효율적이고 "이해"하기 쉽습니다.
Javascript와 같은 언어도 이 문제에 대해 동일한 기능을 수행하기 때문에 비슷한 비판을 받았습니다. 그러나 언어가 결국 대규모로 사용된다면 그 언어에는 반드시 그 이유가 있을 것입니다. PHP는 웹 서비스 개발을 위해 선택되는 스크립팅 언어가 되었고, Javascript가 웹 프론트엔드 분야를 직접적으로 지배하게 되었습니다. 개발자들이 이를 선택했다는 것은 우연이 아닙니다. 프로그래밍 언어는 인간과 기계 사이의 다리이며, 궁극적으로 추구하는 것은 “누구나 프로그래밍할 수 있다”라는 원대한 목표를 달성하는 것입니다.
0과 1의 기계어 코드부터 어셈블리 언어, C 언어, 동적 스크립팅 언어 PHP까지 언어 개발의 역사를 살펴봅니다. 실행 효율성은 기하급수적으로 감소하지만 학습 임계값도 기하급수적으로 감소합니다. PHP 언어는 C의 메모리 관리 및 포인터의 복잡성을 보호할 뿐만 아니라 변수 유형의 복잡성도 더욱 보호합니다. 프로젝트 개발의 효율성을 높이고 학습의 문턱을 낮추는 동시에 일정량의 실행 성능을 희생합니다. 그런 다음 HHVM의 Hack은 변수의 복잡성을 다시 도입하면서 "원시로의 복귀" 느낌을 줍니다. 물론, 서로 다른 언어는 서로 다른 시나리오의 문제를 해결하므로 일반화할 수 없습니다.
HHVM의 PHP 성능 향상은 인상적이며 열심히 일하는 PHP7이 매우 기대됩니다. 둘 다 훌륭한 오픈 소스 프로젝트이며 지속적으로 발전하고 발전하고 있습니다. 현재로서는 PHP7의 공식 버전이 출시되려면 아직 시간이 많이 걸리기 때문에 현재 성능 최적화 솔루션으로 선택하는 것은 당연히 HHVM입니다. 그러나 개인적으로 저는 PHP7이 PHP 코드와 이전 버전과 더 호환되기 때문에 더 낙관적입니다. 둘 사이에 성능 차이가 크지 않다면 더 간단한 것을 선택하겠습니다.
추천 튜토리얼: "php 비디오 튜토리얼"
위 내용은 PHP7과 HHVM 간의 성능 전쟁을 시청하세요의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!