>  기사  >  백엔드 개발  >  PHP7과 HHVM의 성능에 대한 자세한 소개(그림 및 텍스트)

PHP7과 HHVM의 성능에 대한 자세한 소개(그림 및 텍스트)

黄舟
黄舟원래의
2017-03-24 10:07:524464검색

PHP 언어 순위 변화

"TIOBE프로그래밍 언어 순위"에 따른 순위(목록은 통계적 방법에는 한계가 있지만 여전히 좋은 참고 자료입니다. 2010년에 PHP는 세계 프로그래밍 언어 중 3위를 차지했습니다. PHP 언어는 PC 인터넷 시대에 웹 분야에서 가장 강력한 언어라고 볼 수 있습니다.        

PHP7和HHVM的性能之争介绍 - 徐汉彬Hansion - 技术行者

PHP 프로그래머들 사이에 떠도는 농담이 있었습니다. 다들 시끄럽게 굴면 너랑 저녁 먹겠다. ​ ​

PHP 프로그래머: PHP는 세계 최고의 언어입니다!
포럼 프라이팬, 온갖 말다툼… 여자 : 데려가자, 가자!
PHP 프로그래머: 오늘은 아닙니다. PHP가 최고의 언어임에 틀림없다고 설득해야 합니다.


자, 본론으로 들어가겠습니다. 언어 자체는 좋거나 나쁘지 않습니다. 단지 사용되는 시나리오에서 다양한 문제를 해결할 뿐입니다. 인터넷 시대는 모바일 인터넷의 등장으로 짧은 시간 안에 매우 빠르게 변화하고 있습니다. 4년이 넘는 기간 동안 모바일 기술의 발전은 전 세계를 휩쓸었습니다. 동시에 다양한 언어가 등장하고 한때 영광스러웠던 PHP는 원래 프로그래밍 언어 목록에서 6위로 떨어졌습니다(2014년 12월 목록 하나). 그 결과, PHP를 욕하는 목소리가 속속 등장했습니다.

       PHP7和HHVM的性能之争介绍 - 徐汉彬Hansion - 技术行者

그런데 Niao 형제(PHP 언어 개발자 중 한 명인 Hui Xinchen)가 2014년 Qcon에서 데이터를 공유했습니다. 전 세계 상위 100만개 웹사이트 중 81.3%가 사용된 웹 서버 스크립팅 언어는 PHP로, 2013년 같은 기간에는 78.3%를 차지했습니다. 즉 웹서비스 측면에서는 PHP가 줄어들지 않았지만, 모바일 인터넷 물결 속에서는 많이 늘어났다는 것이다. 따라서 다른 언어 기술의 적용이 희석됩니다.

최근 PHP7과 HHVM의 성능 비교가 뜨거운 논란을 불러일으키고 있으며, PHP 성능 향상의 미래는 어느 것인지 모두가 관심을 갖고 논의하고 있습니다.

HHVM(HipHop Virtual Machine)의 유래

HHVM은 JIT 컴파일 및 기타 기술을 크게 사용하는 오픈 소스 PHP 가상 머신입니다.

PHP 코드

의 실행 성능을 향상시킵니다. 현재 네이티브 PHP 코드 버전의 실행 성능이 5~10배 향상될 수 있다는 소문이 있습니다. HHVM은 Facebook에서 시작되었습니다. Facebook의 초기 코드 중 상당수는 PHP를 사용하여 개발되었습니다. 그러나 비즈니스의 급속한 발전과 함께 PHP가 구현되었습니다. 운영 효율성은 점점 더 분명한 문제가 되었습니다. 실행 효율성을 최적화하기 위해 페이스북은 2008년부터 PHP 실행 엔진인 HipHop을 사용하기 시작했습니다. 대량의 Facebook 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의 경우 어떤 종류의 데이터가 저장되든 위에서 언급한 "kill" 구조를 이용해 구현됩니다. PHP 프로그래머의 변수 유형 "침입"과 호환되기 위해 PHP는 개발자에게는 친절하지만 실행 엔진에는 잔인합니다. 단일 변수의 메모리 소비는 아직 명확하지 않을 수 있습니다. PHP의 배열 등을 사용하면 복잡성이 기하급수적으로 증가합니다(배열의 구현은 HashTable입니다). 그런 다음 Zend 엔진이 실행되면 이러한 PHP 코드는 opcode(PHP의 중간 바이트코드, 형식이 어셈블리와 다소 유사함)로 컴파일되고 Zend 엔진은 이를 한 줄씩 컴파일합니다. 설명 및 실행.

문자열의 연결 연산이든 단순한 배열의 수정이든 등등 거의 대부분이 "PHP 프로그래머의 한마디, 그러면 Zend 엔진이 다리를 부러뜨릴 것입니다." Rhythm. 따라서 동일한 작업에 대해 PHP는 C보다 CPU, 메모리 등 시스템 리소스를 더 많이 소비합니다. 또한 자동 메모리 재활용, 변수 유형 판단 등이 있어 시스템 리소스 소비가 증가합니다.

예를 들어 순수 PHP에 구현된 빠른 정렬 기능과 기본 정렬 기능을 사용하여 10,000개의 정수를 정렬하여 시간이 많이 걸리는 비교 결과는 다음과 같습니다. 🎜>

PHP7和HHVM的性能之争介绍 - 徐汉彬Hansion - 技术行者

기본 정렬에는 3.44ms가 소요되는 반면, PHP 함수의 자체 구현은 3.44ms입니다. 정렬에는 68.79가 걸립니다. ms. 우리는 둘 사이의 실행 효율성에 큰 차이가 있음을 발견했습니다. 내 테스트 방법은 전체 PHP 스크립트의 시작부터 끝까지의 시간이 아니라 함수가 실행되기 전후의 시간 간격을 계산하는 것입니다. 시작하고 종료하는 PHP 스크립트도 있습니다. 프로세스 자체에는 일련의 초기화 및 정리 작업이 있으며, 이 작업에도 많은 시간이 소요됩니다. >        
       

       PHP7和HHVM的性能之争介绍 - 徐汉彬Hansion - 技术行者
~        

보통 PHP 실행 효율성 순위는

                 

PHP 언어의 일부인(전혀 함수가 아님) PHP 언어 구조(isset, echo 등)가 가장 빠릅니다.

    그럼 더 빠른 것은 PHP의 기본 기능과 확장 기능입니다. Zend API를 기반으로 하는 PHP 확장은 C로 기능을 구현하며 실행 효율성은 C++/Java와 동일합니다.
  1. 정말 느린 것은 PHP를 통해 직접 작성하는 코드와 함수입니다. 예를 들어 순수 PHP로 구현된 상대적으로 무거운 프레임워크를 사용하는 경우 프레임워크 자체에 많은 모듈이 있기 때문에 언어 수준에서 실행 효율성이 저하되고 더 많은 메모리를 차지하게 됩니다. (국내 Yaf 프레임워크를 확장하여 구현하여 순수 PHP로 작성된 프레임워크에 비해 실행 효율성이 훨씬 빠릅니다.)

                         

PHP7和HHVM的性能之争介绍 - 徐汉彬Hansion - 技术行者
       

일반적인 상황에서는 특히 웹 시스템 트래픽이 상대적으로 큰 시나리오에서는 PHP를 사용하여 복잡한 논리 계산 기능을 구현하지 않는 것이 좋습니다. 그러므로 PHP 프로그래머는 PHP의 다양한 기본 기능과 다양한 확장에 대해 상대적으로 폭넓게 이해하세요. 복잡한 솔루션을 직접 작성하는 대신 기본 솔루션(기본 인터페이스 또는 확장)을 찾으세요. 이러한 유형의 기능을 구현하는 PHP 코드입니다.

PHP 확장 개발 능력이 충분하다면 이러한 유형의 비즈니스 기능을 PHP 확장으로 다시 작성하면 코드 실행 효율성도 크게 향상됩니다. 이것은 매우 좋은 방법이며 PHP 최적화에도 널리 사용됩니다. 그러나 자체 작성 PHP 비즈니스 개발의 단점도 분명합니다.

  1. 확장 개발은 시간이 오래 걸리고 요구 사항이 변경되면 수정이 복잡하며, 작성이 어렵습니다. 웹 서비스의 안정성에 영향을 줄 수 있습니다. (예를 들어 Apache의 작업자 모드에서 다중 스레드 시나리오에서 중단되면 동일한 프로세스의 다른 일반 하위 스레드에 영향을 미칩니다. 다중 스레드 웹 모드인 경우 확장 작성도 스레드 안전 )

  2. PHP 버전이 업그레이드되면 확장 프로그램에 추가적인 호환성 작업이 필요할 수 있습니다.

  3. 인원 변경 후 유지관리 및 인수 비용도 상대적으로 높다.

실제로 일선 인터넷 기업들 사이에서는 PHP 확장을 추가하는 것이 아니라 C/를 사용하는 것이 더 일반적인 해결책입니다. C++ 독립적으로 서비스 서버를 작성한 다음 PHP 자체를 비즈니스와 결합하지 않고 PHP가 소켓을 통해 서비스 서버와 통신하여 비즈니스 처리를 완료합니다.

그러나 웹 서비스의 성능 병목 현상의 대부분은 네트워크 전송 및 기타 서비스 서버(예: MySQL 등)의 시간 소모에 있으며, PHP 실행에 소요되는 시간 전체 시간이 소요되는 비율은 매우 작으므로 비즈니스 관점에서는 그 영향이 명확하지 않을 수 있습니다.

2. HHVM이 PHP 실행 성능을 향상시키는 방식                       Zend 엔진을 대체하여 PHP의 중간 바이트코드를 생성하고 실행합니다(HHVM은 자체 형식의 중간 바이트코드를 생성합니다). 코드), JIT를 통해 실행됨(Just                            

Time

, JIT(Just-In-Time) 컴파일은 소프트웨어 최적화 기술로, 런타임 시 바이트코드를 기계어로 컴파일하고 실행을 위해 기계어로 변환하는 것을 의미합니다. Zend 엔진의 기본 방법은 먼저 opcode로 컴파일한 다음 하나씩 컴파일하는 것입니다. 실행, 일반적으로 각 명령어는 C 언어 수준 기능에 해당합니다. 다수의 반복되는 opcode(순수 PHP로 작성된 코드 및 함수)를 생성하면 Zend는 이러한 C 코드를 하나씩 여러 번 실행합니다. 암호. JIT가 하는 일은 한 단계 더 나아가 런타임에 반복적으로 실행되는 다수의 바이트코드를 기계어 코드로 컴파일하여 실행 효율성을 높이는 것입니다. 일반적으로 JIT를 트리거하는 조건은 코드나 함수가 다음과 같다는 것입니다. 반복되는 통화.        

> >

일반적인 PHP 코드는 변수의 유형을 고정할 수 없기 때문에 유형을 결정하는 별도의 논리 코드를 추가해야 하며 이러한 PHP 코드는 CPU 실행 및 최적화에 도움이 되지 않습니다. 의. 따라서 HHVM은 일반적으로 변수 유형을 고정하고 가상화를 용이하게 하기 위해 Hack 작성 방법(특정 기능과 호환되도록 추가된 추가 기술 코드)이 포함된 PHP 코드를 "협력"해야 합니다. 머신이 컴파일되고 실행됩니다. PHP는 모든 유형을 하나의 형식으로 수용하는 것을 추구하는 반면 Hack은 특정 유형으로 수용되는 모든 것을 표시할 수 있습니다.

PHP 코드 Hack 작성 방법 예: ~            

> ​ ​ ​  PHP7和HHVM的性能之争介绍 - 徐汉彬Hansion - 技术行者

위의 예에서는 PHP 코드가 주로 변수 유형으로 추가되었습니다. Hack 라이팅의 일반적인 방향은 HHVM과 협력하기 위해 기존의 "동적" 작성 방식을 "

정적" 작성 방식으로 변경하는 것입니다.

HHVM은 높은 성능으로 많은 주목을 받았고, 일부 1차 인터넷 기업들도 이를 따라잡기 시작했다. 순수 언어 실행 성능 테스트 결과로 볼 때, HHVM은 개발 중인 PHP7 버전보다 훨씬 앞서 있습니다.

WordPress 오픈소스 블로그 홈페이지를 이용한 테스트 시나리오 결과, HHVM과 PHP7의 격차는 그리 크지 않습니다. 격차가 뚜렷하지 않습니다. | ~ ​ ​  

그러나 PHP7은 아직 개발 중입니다. 사용 가능한 기술 솔루션으로 판단하면 현재 HHVM이 약간 더 좋습니다. 그러나 HHVM의 배포 및 적용에는 몇 가지 문제가 있습니다.
서비스 배포가 복잡하고 일정한 유지 관리 비용이 발생합니다.


은 PHP 네이티브 코드를 완전히 지원하지 않으며, PHP 확장도 제대로 호환되어야 합니다.


HHVM은 새로운 가상 머신이므로 장시간 실행 시 메모리 누수가 발생할 수 있습니다. (일류 인터넷 기업에서는 이 기술을 적용할 때 자체 패치를 통해 메모리 누수를 해결한다고 합니다.)

                      비교적 새로운 오픈소스 프로젝트의 경우 아직 성숙하는 데 시간이 걸립니다.

PHP7의 성능 혁신

  1. 이번 버전에서는 PHP가 오랫동안 비판을 받아온 성능 문제가 대폭 개선됩니다. 해당 버전에는 PHP6가 없다고 하는데, 이후에는 혼란을 피하기 위해 대부분의 기능이 PHP7에서 구현될 예정입니다. (몇 년 전에는 PHP6 관련 책도 읽었습니다.)

  2. 1. PHP7 소개
  3.                                           >공식이지만 PHP7 버전은 2015년 10월까지 출시되지 않을 수 있으며, 테스트 버전은 내년 6월에 출시되고 3~4개월의 품질 보증이 이어집니다.

  4. PHP 커뮤니티의 프로젝트 계획은 다음과 같습니다.       


                                                                                       > 개발 중인

    에서 볼 수 있는 기능 설명은 다음과 같습니다. 상대적으로 모호하다. 확실히 더 많은 기능이 있지만 아직 발표되지 않았습니다. 다음은 PHP 커뮤니티에서 가져온 것입니다. PHP7은 개발 중인 프로젝트이므로 정확하지 않을 수 있지만 살펴보는 데 방해가 되는 것은 아닙니다.

    PHPNG(PHP 차세대, 차세대 PHP), JIT를 포함한 Zend 실행 엔진 자체에 대한 다양한 성능 최적화를 Zend에서 구현할 수 있습니다.                                                           Opcache 구성 요소.
    1. AST(Abstract Syntax Tree, 추상 구문 트리)는 PHP 컴파일 프로세스에 미들웨어를 도입하여 PHP 컴파일 프로세스에서 직접 opcode를 뱉어내는 방식을 대체하도록 설계되었습니다. 통역사. 인터프리터와 컴파일러를 분리하면 많은 Hack 코드를 줄일 수 있으며 동시에 구현을 더 쉽게 이해하고 유지 관리할 수 있습니다.
    2. 균일 변수 구문(통합 변수 구문)은 내부적으로 일관되고 완전한 변수 구문을 도입하여 PHP 파서가 다양한 유형의 변수를 더 완벽하게 지원할 수 있도록 합니다. $$a 변수 등과 같은 일부 변수의 사용법을 조정해야 합니다.
    3. NaN, Infinity, 071af19a55f4da1989e8c02b755ba052>와 같은 정수 의미론(정수 의미론)을 지원하고 list()의 일관성을 수정합니다. 등등 잠깐만요.
    4. 위 기능 중 가장 기대되는 것은 PHPng의 성능 최적화입니다. PHP 커뮤니티에서 일부 성능 속도 테스트 데이터를 공개했습니다. 데이터 관점에서 PHPng 프로젝트 초기에 비해 실행 성과가 2배 가까이 향상됐다. 이 결과는 이미 매우 좋습니다. 더욱이 가장 중요한 것은 아직 완료되지 않은 PHP7 최적화 계획이 많다는 것입니다. 모든 것이 완료될 때까지 기다리세요. 나는 우리가 더 높은 성능의 PHP7을 볼 수 있다고 믿습니다.

    이 속도 테스트 데이터는 PHP 커뮤니티(wiki.php.net/phpng)에서 제공되며 데이터의 일부를 가로챕니다.

                                                                                                  🎜>
    >              

    간단한 번역:

                                             

    전체 테스트 속도가 35% 향상되었습니다.

    실제 적용 시나리오에서는 20~70% 속도 향상이 있습니다(워드프레스 홈페이지는 60% 향상됨)

      더 적은 메모리 소모
    • 가장 일반적으로 사용되는 SAPI 지원
    • 리소스 할당에 바인딩된 대부분의 PHP 확장 지원(69개 완료, 6개 마이그레이션 예정)
    • HHVM3.3.0과 유사한 실행 속도 제공
    •                             ​ ​  
    • 2. PHP의 약한 타입 논란
    • > >

      PHP에는 논란의 여지가 많은 기능이 있지만, 언어 버전이 출시되고 개선되면서 기능과 특징에 대한 비판이 줄어들기 시작했습니다. 그러나 PHP의 "약한 유형" 기능은 분명히 더 논란이 많았습니다. HHVM이 Hack을 통해 "약한 유형" 기능을 직접 "제거"했다는 사실에서 HHVM이 "약한 유형" 기능을 좋아하지 않는다는 것을 알 수 있습니다. 그러나 우리의 많은 곳에서는 PHP 프로그래머의 눈에는 이것이 PHP의 중요한 장점 중 하나입니다. PHP의 변수는 모든 것을 포용하면서 캐주얼하고 우아하게 설계되었습니다. 덕분에 언어가 더욱 단순해지지 않나요?

      ​ ​  

      사실 심각한 문제라고 생각하는 분들도 계시는데, '약한 타이핑'에 대한 비판은 대략 다음과 같습니다.

                                  ​ ​ ​  

      1. "엄격한" 언어에서는 일반적으로 변수 유형이 처음부터 끝까지 미리 정의되어 있습니다. , 사용 범위도 정해져 있습니다. PHP의 변수 의 경우 일반적으로 이름만 볼 수 있으며 대부분의 유형은 미리 정의할 수 없으며 마음대로 변경할 수 있습니다. (메모리 할당 관리가 쉽지 않음)

      2. PHP는 약한 타입 기능과 호환되기 위해서는 타입을 포함한 대량의 호환 가능한 코드를 구현해야 합니다. 판단, 유형 변환, 저장 방법 등은 언어 내부의 복잡성을 증가시킵니다. (낮은 실행 효율성)

      3. 변수의 유형을 제어할 수 없는 경우 실행 과정에서 "암시적 유형 변환"이 많이 발생하여 쉽게 발생할 수 있습니다. 예측할 수 없는 결과로. (여기서 강조할 점은 PHP 타입 변환은 꼭 숙지해야 할 포인트입니다. 다양한 타입을 서로 변환하면 특히 PHP를 처음 접하는 학생들에게는 많은 문제가 발생할 수 있습니다)

                                  ​ ​ ​  

      그들은 이것이 "보이는 대로 얻는다"라는 단순성과는 맞지 않으며, 엄격한 문법을 ​​갖춘 언어가 더 효율적이고 효율적이라고 믿습니다. "이해"하기가 더 쉽습니다.

                   

      Javascript와 같은 언어도 이 문제에 대한 성능이 동일하기 때문에 비슷한 비판을 받았습니다. 그러나 언어가 궁극적으로 대규모로 사용되려면 그들에게는 이유가 있습니다. PHP는 웹 서비스 개발을 위해 선택되는 스크립팅 언어가 되었고, Javascript는 웹 프런트 엔드 분야를 직접적으로 지배했습니다. 우리가 개발자가 사용하는 지점에 도달한 것은 우연이 아닙니다. 발이 그들에게 투표했습니다. 프로그래밍 언어는 인간과 기계 사이의 다리이며, 궁극적으로 추구하는 것은 “누구나 프로그래밍할 수 있다”라는 원대한 목표를 달성하는 것입니다.

      ​ ​  

      0과 1의 기계어 코드부터 어셈블리 언어, C 언어, 동적 스크립팅 언어 PHP까지 언어 개발의 역사를 통틀어. 실행 효율성은 기하급수적으로 감소하지만 학습 임계값도 기하급수적으로 감소합니다. PHP 언어는 C의 메모리 관리 및 포인터의 복잡성을 보호할 뿐만 아니라 변수 유형의 복잡성도 더욱 보호합니다. 프로젝트 개발의 효율성을 높이고 학습의 문턱을 낮추는 동시에 일정량의 실행 성능을 희생합니다. 그런 다음 HHVM의 Hack은 변수의 복잡성을 다시 도입하면서 "원시로의 복귀" 느낌을 줍니다. 물론, 서로 다른 언어는 서로 다른 시나리오의 문제를 해결하므로 일반화할 수 없습니다.

      ~ > ~               둘 다 훌륭한 오픈 소스 프로젝트이며 지속적으로 개선되고 있습니다. 앞으로 나아가고 발전합니다. 현재로서는 PHP7의 공식 버전이 출시되려면 아직 시간이 많이 걸리기 때문에 현재 성능 최적화 솔루션으로 선택하는 것은 당연히 HHVM입니다. 하지만 개인적으로 더 선호하는 건 나는 PHP7이 PHP 코드와 이전 버전과 더 호환되기 때문에 낙관적입니다. 둘 사이에 성능 차이가 크지 않다면 더 간단한 것을 선택하겠습니다.

위 내용은 PHP7과 HHVM의 성능에 대한 자세한 소개(그림 및 텍스트)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.