바위 밑에서 살았거나 과거에 살았던 적이 없다면 JIT
가 PHP 8
로 출시된다는 사실을 알고 계실 것입니다. 투표는 오늘 조용히 종료됩니다. , 압도적으로 대부분의 사람들이 PHP8
로 병합하는 것을 선호하므로 공식적으로 이 문서php8.0 버전의 최적화 및 개선에 대한 포괄적인 해석입니다. JIT
正在进入PHP 8
:投票今天悄然结束,绝大多数人赞成合并到PHP8
,所以,这是正式的,本文全方位解读php8.0版本优化与改进。
PHP8 官宣《PHP 8 来了! PHP团队发布了首个测试版本 Alpha1》
现在,坐下来阅读下面这篇颠覆神话的文章,我们将澄清一些关于JIT是什么、它将带来什么好处的困惑,并深入研究它是如何工作的(但只是一点点,因为我不想让你感到无聊)。
因为我不知道我在和谁说话,所以我会从简单的问题开始,一直到复杂的问题,如果你已经确定你知道标题中问题的答案,你可以跳过那部分。。。
PHP实现了一个虚拟机,一种虚拟处理器,我们称之为Zend VM。PHP将人类可读的脚本编译成虚拟机能够理解的指令(我们称之为操作码),这个执行阶段就是我们所说的“编译时”。在执行的“运行时”阶段,虚拟机(Zend VM)执行代码的指令(操作码)。
这一切工作得很好,像APC(过去)和OPCache(现在)这样的工具可以缓存代码的指令(操作码),以便“编译时”只在必须的时候发生。
首先,有一行代码解释了什么是JIT:
Just-in-time
是一种编译器策略,它接受代码的中间表示形式,并在运行时将其转换为依赖于体系结构的机器代码,以便及时执行。
在PHP中,这意味着JIT将为Zend VM生成的指令作为中间表示,并发出依赖于体系结构的机器代码,因此代码的宿主不再是ZendVM,而是CPU。
为什么PHP需要JIT?
在PHP 7.0之前,PHP内部社区关注的焦点是性能,这是由Facebook的HHVM项目带来的良性竞争带来的。PHP 7.0中的大部分核心更改都包含在PHPNG补丁中,这大大改进了PHP在其核心上利用内存和CPU的方式,从那时起,我们每个人都被迫关注性能。
自PHP 7.0以来,已经有了一些性能改进,HashTable
(PHP的核心数据结构)的优化,某些操作码的Zend VM的专门化,某些序列的编译器的专门化,以及对OPCache的优化器组件的不断改进。。。除此之外还有很多其他的,太无聊了。
这是一个残酷的事实,这些优化只能带我们到目前为止,我们正在迅速接近,或可能已经遇到了砖墙,在我们的能力,以进一步改善它。
注意:当我们说“我们不能再改进了”时,我们真正的意思是,“我们必须做出取舍,以进一步改进它不再看起来有吸引力”。。。每当我们讨论性能优化时,我们都在讨论权衡。通常,在简单性和性能之间进行权衡。我们都想认为最简单的代码是最快的代码,但在现代的C编程世界中,情况并非如此。最快的代码通常是准备利用依赖于体系结构的内部函数或依赖于平台(编译器)的内部函数的代码。简单并不能保证最好的性能。。。
此时,PHP的JIT功能似乎是从PHP获得更多性能的最佳方法。
JIT会让我的网站更快吗?
很有可能,并不明显。
也许不是您期望的答案:在一般情况下,用PHP编写的应用程序是I/O绑定
的,JIT
在CPU绑定
的代码上工作得最好。
“I/O和CPU绑定”到底是什么意思?
当我们想要描述一段代码或一个应用程序的一般性能特征时,我们使用术语I/O绑定
和CPU绑定
PHP8 공식 발표 "PHP 8이 출시되었습니다! PHP 팀은 첫 번째 베타 버전인 Alpha1을 출시했습니다》이제 JIT가 무엇인지, JIT가 가져올 이점에 대한 혼란을 해소할 다음 신화 깨기 기사를 편안하게 읽어보세요. 그리고 그것이 어떻게 작동하는지 파헤쳐 보세요(그러나 지루하게 하고 싶지 않기 때문에 아주 조금만).
Just-in-time
은 코드의 중간 표현을 허용하고 이를 런타임에 변환하는 컴파일러 전략입니다. 적시 실행. 🎜🎜PHP에서 이는 JIT가 Zend VM에 의해 생성된 명령을 중간 표현으로 취하고 아키텍처 종속 기계 코드를 생성하므로 코드의 호스트는 더 이상 ZendVM이 아니라 CPU라는 의미입니다. 🎜🎜PHP에 JIT가 필요한 이유는 무엇인가요? 🎜🎜PHP 7.0 이전에는 PHP 내부 커뮤니티의 초점은 성능이었습니다. 이는 Facebook의 HHVM 프로젝트를 통한 건전한 경쟁이 가져온 성과였습니다. PHP 7.0의 핵심 변경 사항 대부분은 PHPNG 패치에 포함되어 PHP가 코어에서 메모리와 CPU를 활용하는 방식을 크게 개선했으며 그 이후로 우리 모두는 성능에 집중할 수 없게 되었습니다. 🎜🎜PHP 7.0부터 일부 성능 개선, HashTable
(PHP의 핵심 데이터 구조) 최적화, 특정 opcode에 대한 Zend VM 전문화, 특정 시퀀스 전문화에 대한 컴파일러 최적화 및 OPCache 최적화 프로그램에 대한 지속적인 개선이 이루어졌습니다. 요소. . . 그 외에도 너무 많아서 지루해요. 🎜🎜이러한 최적화가 지금까지만 가능하고 우리가 빠르게 접근하고 있거나 이를 더 개선할 수 있는 능력이 막혔을 수도 있다는 것은 엄연한 사실입니다. 🎜🎜참고: "더 이상 나아질 수 없습니다"라고 말할 때 실제로 의미하는 바는 " 더 이상 매력적이지 않게 보이도록 더 개선하기 위해 절충해야 합니다.” . . 성능 최적화를 논의할 때마다 절충안을 논의합니다. 단순성과 성능 사이에는 절충안이 있는 경우가 많습니다. 우리 모두는 가장 단순한 코드가 가장 빠른 코드라고 생각하고 싶어하지만 현대 C 프로그래밍 세계에서는 그렇지 않습니다. 가장 빠른 코드는 일반적으로 아키텍처 종속 내장 함수 또는 플랫폼(컴파일러) 종속 내장 함수를 활용하도록 준비된 코드입니다. 단순성이 최고의 성능을 보장하지는 않습니다. . . 🎜🎜현재로서는 PHP의 JIT 기능이 PHP에서 더 많은 성능을 얻을 수 있는 가장 좋은 방법인 것 같습니다. 🎜🎜JIT를 사용하면 내 웹사이트가 더 빨라지나요? 🎜🎜매우 가능하지만 명확하지는 않습니다. 🎜🎜원하는 대답이 아닐 수도 있습니다. 일반적으로 PHP로 작성된 애플리케이션은
I/O 바인딩
이고 JIT
는 CPU 바인딩
으로 가장 잘 작동합니다. 코드에. 🎜🎜"I/O 및 CPU 바인딩"이 정확히 무엇을 의미하나요? 🎜🎜코드나 애플리케이션의 일반적인 성능 특성을 설명할 때 I/O 바운드
및 CPU 바운드
라는 용어를 사용합니다. 🎜🎜가장 간단한 표현은 다음과 같습니다. 🎜🎜🎜🎜I/O 바인딩 코드는 I/O를 개선(감소, 최적화)할 수 있으면 더 빠르게 실행됩니다. 🎜🎜🎜🎜CPU가 실행하는 명령을 개선(감소, 최적화)하거나 CPU의 클럭 속도를 (마법처럼) 높일 수 있다면 CPU 바인딩된 코드 조각이 더 빠르게 실행될 것입니다 :) 🎜🎜🎜🎜A 코드 조각 또는 애플리케이션은 I/O 바인딩, CPU 바인딩 또는 CPU와 I/O 모두 동일하게 바인딩될 수 있습니다. 🎜일반적으로 PHP 애플리케이션은 I/O 바인딩되는 경향이 있습니다. 데이터베이스, 캐시, 파일, 소켓 단어 등에 대한 연결, 읽기 및 쓰기 등 수행 중인 I/O로 인해 속도가 느려집니다.
CPU 바인딩 PHP는 어떤 모습인가요?
대부분의 PHP 애플리케이션의 특성으로 인해 많은 PHP 프로그래머는 CPU 바인딩 코드에 익숙하지 않습니다. 그들의 임무는 종종 일부 데이터베이스나 캐시에 연결하여 가벼운 작업을 수행하고 를 출력하는 것입니다. html/json/xml
응답. html/json/xml
响应。
您可能会环顾代码库,发现许多与I/O无关的代码,甚至调用与I/O完全断开连接的函数的代码,并且会感到困惑,我似乎是在暗示这并没有使您的应用程序CPU受到限制,即使处理非I/O的代码行数可能比I/O多。
PHP实际上相当快,它是世界上解释速度最快的语言之一。Zend VM调用与I/O无关的函数和在机器代码中进行相同的调用之间没有显著的区别。
这显然是有区别的,但事实是,机器代码有一个调用约定,Zend VM有一个调用约定,机器代码有一个序言,Zend VM有一个序言:在Zend操作码中调用某个c_level_function()
还是机器代码对调用应用程序的性能没有显著影响-尽管这似乎对那个电话有很大的影响。
注意:调用约定大致是指在进入另一个函数之前执行的一系列指令,序言是指在进入另一个函数时执行的一系列指令:在这两种情况下,调用约定都将参数推送到堆栈上,序言将它们从堆栈中弹出。
循环、尾调用和X呢?我听说你问过:PHP实际上非常聪明,启用了OPCache的优化器组件,你的代码就好像被魔法转化成了你能编写的最有效的形式。
现在需要注意的是,JIT不会改变Zend函数的调用约定,而不是VM建立的约定-Zend必须能够在任何时候在JIT和VM模式之间切换,因此决定保留VM建立的调用约定。因此,当JIT运行时,随处可见的那些调用并没有明显地加快速度。
如果您想了解CPU绑定的PHP代码是什么样子的,请查看Zend/bench.php
文件... 这显然是一个极限的CPU代码示例,但它应该让我们知道JIT真正的亮点是在数学领域。
PHP是否为加快数学速度做出了最终的权衡?
不,我们这样做是为了扩大PHP的范围,而且相当大。
在这个非常偏颇的PHP开发人员看来,如果你在2019年是一名web程序员,你还没有考虑在下一个项目中使用PHP,那么你做的web是错误的。
在PHP中提高更快地执行数学的能力,乍一看,似乎是一个非常狭窄的范围。
然而,这实际上为机器学习、3d渲染、2d(gui)渲染和数据分析(仅举几个例子)打开了大门。
为什么我们不能在PHP 7.4中使用它呢?
我刚刚把JIT称为“最终的权衡”,我认为它是:它可以说是有史以来最复杂的编译器策略之一,也许是最复杂的。引入JIT就是引入相当的复杂性。
如果你问Dmitry(JIT的作者)他是否让PHP变得复杂,他会说“不,我讨厌复杂性”(这是一个直接的引语)。
归根结底,复杂是我们所不了解的,而目前,真正了解JIT实现的内部开发人员(不到几个)很少。
PHP 7.4的发展很快,合并到php7.4中会给我们留下一个PHP版本,只有不到几个人可以调试、修复或改进(在任何实际意义上)。对于那些对合并到PHP 7.4投反对票的人来说,这种情况是不可接受的。
在从现在到PHP 8的这段时间里,我们中的许多人将在业余时间努力理解JIT:
我们仍然有一些要实现的特性和需要为php8重写的工具,首先我们必须理解JIT。我们需要这一次,并非常感谢大多数选民认为适合把它交给我们。
复杂并不是可怕的同义词:
复杂可以是美丽的,就像星云一样,JIT就是那种复杂。原则上,你可以完全理解某件复杂的事情,并且只在表面上的复杂程度上稍微降低一点。换句话说,即使有20个内部开发人员和Dmitry一样熟悉JIT,它也不会真正改变JIT的复杂性。
PHP的开发速度会减慢吗?
没有理由认为会这样。我们有足够的时间可以满怀信心地说,到PHP 8
普遍可用时,我们中已经有足够多的人熟悉JIT
를 호출합니다. )
또는 기계어 코드는 호출 애플리케이션의 성능에 큰 영향을 미치지 않습니다. 하지만 해당 호출에는 큰 영향을 미치는 것으로 보입니다. 🎜🎜참고: 호출 규칙은 대략적으로 다른 함수를 입력하기 전에 실행되는 일련의 명령을 나타내며, 서문은 다음을 나타냅니다. 다른 함수를 입력할 때 실행되는 일련의 명령입니다. 두 경우 모두 호출 규칙은 인수를 스택에 푸시하고 프롤로그는 인수를 스택에서 팝합니다. 🎜🎜루프, 테일 호출 및 X는 어떻습니까? 당신이 묻는 것을 들었습니다: PHP는 실제로 매우 똑똑하며 OPCache의 최적화 구성 요소가 활성화되면 코드가 마술처럼 당신이 작성할 수 있는 가장 효율적인 형식으로 변환됩니다. 🎜🎜이제 JIT는 VM에 의해 설정된 것이 아니라 Zend 함수의 호출 규칙을 변경하지 않는다는 점에 유의하는 것이 중요합니다. Zend는 언제든지 JIT와 VM 모드 사이를 전환할 수 있어야 하므로 다음과 같이 결정했습니다. VM이 설정한 호출 규칙을 유지합니다. 따라서 JIT가 실행 중일 때 모든 곳에서 해당 호출의 속도가 크게 향상되지 않습니다. 🎜🎜CPU 바인딩된 PHP 코드가 어떻게 보이는지 보려면
Zend/bench.php
파일을 살펴보세요... 이것은 분명히 극단적인 CPU 코드 예제이지만 우리는 JIT의 진정한 하이라이트가 수학 분야에 있다는 것을 알고 있습니다. 🎜🎜🎜 PHP는 더 빠른 수학을 위해 궁극적인 절충안을 제공합니까? 🎜🎜🎜아니요, 우리는 PHP의 범위를 확장하기 위해 이 작업을 수행하고 있으며 그 규모는 꽤 큽니다. 🎜🎜매우 편견이 강한 이 PHP 개발자의 의견에 따르면, 귀하가 2019년 웹 프로그래머이고 다음 프로젝트에서 PHP 사용을 고려하지 않았다면 웹을 잘못하고 있는 것입니다. 🎜🎜PHP에서 수학을 더 빠르게 수행하는 능력을 향상시키는 것은 언뜻 보기에는 매우 좁은 범위인 것 같습니다. 🎜🎜그러나 이것은 실제로 기계 학습, 3D 렌더링, 2D(GUI) 렌더링 및 데이터 분석(몇 가지 예)에 대한 문을 열어줍니다. 🎜🎜🎜PHP 7.4에서는 왜 사용할 수 없나요? 🎜🎜🎜나는 방금 JIT를 "궁극적 절충"이라고 불렀고, 제 생각에는 JIT가 틀림없이 역대 가장 복잡한 컴파일러 전략 중 하나이며 아마도 가장 복잡할 것입니다. JIT를 도입하면 상당한 복잡성이 발생합니다. 🎜🎜Dmitry(JIT 작성자)에게 PHP를 복잡하게 만들었냐고 묻는다면 그는 "아니요, 저는 복잡함을 싫어합니다"(직접 인용한 내용입니다)라고 답할 것입니다. 🎜🎜결국 복잡성은 우리가 이해하지 못하는 것이며, 현재 JIT 구현을 실제로 이해하는 내부 개발자는 극소수(몇 명 미만)입니다. 🎜🎜PHP 7.4는 빠르게 발전하고 있으며 php7.4로 병합하면 (실제 의미에서) 소수의 사람만이 디버깅, 수정 또는 개선할 수 있는 PHP 버전이 남게 됩니다. PHP 7.4로의 병합에 반대하는 사람들에게 이러한 상황은 용납될 수 없습니다. 🎜🎜지금과 PHP 8 사이에 우리 중 많은 사람들은 여가 시간에 JIT를 이해하려고 노력할 것입니다. 🎜🎜아직 구현해야 할 기능과 php8용으로 다시 작성해야 하는 도구가 있습니다. 먼저 이해해야 합니다. JIT. 우리에게는 이 시간이 필요하며 대다수의 유권자들이 우리에게 이 시간을 제공하는 것이 적합하다고 판단한 것에 대해 매우 감사하고 있습니다. 🎜🎜복잡성은 끔찍함의 동의어가 아닙니다. 🎜🎜복잡성은 아름다울 수 있으며 성운처럼 JIT는 그런 종류의 복잡성입니다. 원칙적으로 복잡한 것을 완전히 이해하고 겉보기 복잡성을 약간만 줄일 수 있습니다. 즉, Dmitry만큼 JIT에 익숙한 내부 개발자가 20명이라고 해도 JIT의 복잡성이 실제로 변하지는 않을 것입니다. 🎜🎜🎜PHP 개발 속도가 느려질까요? 🎜🎜🎜그렇다고 생각할 이유가 없습니다. PHP 8
이 일반적으로 출시될 때쯤이면 우리 중 상당수가 JIT
에 익숙해져서 최소한 버그를 수정하고 PHP를 발전시킬 수 있을 것이라고 자신있게 말할 수 있는 시간은 충분합니다. 앞으로 나아가는 측면에서 오늘날 우리가 하는 것처럼 기능하도록 말이죠. 🎜이를 본질적으로 복잡한 JIT
지점에 연결하려고 할 때, 새로운 기능을 소개하는 데 소비하는 대부분의 시간은 실제로 해당 기능을 논의하는 데 소비된다는 점을 고려하세요. 대부분의 기능이나 수정 사항의 경우 코드를 작성하는 데 몇 분 또는 몇 시간이 걸릴 수 있으며 토론에는 몇 주 또는 몇 달이 걸릴 수 있습니다. 드문 경우지만 기능에 대한 코드를 작성하는 데 몇 시간 또는 며칠이 걸릴 수 있지만 이러한 드문 경우에는 토론이 항상 더 오래 걸립니다.
PHP8에 대한 자세한 분석은 "PHP8 새로운 기능: JIT 그래픽 및 텍스트 상세 설명"을 참조하세요. "PHP8의 성능은 실제로 얼마나 향상되었나요? 》
이 기사는 PHP 중국어 웹사이트에서 직접 번역되었습니다: https://blog.krakjoe.ninja/2019/03/php-gr8.html
위 내용은 php8.0 버전 최적화 및 개선에 대한 종합적인 해석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!