gpt4 book ai didi

php - 在 PHP 7.4 上预加载和 JIT(即将在 PHP 8 上发布)有什么区别

转载 作者:行者123 更新时间:2023-12-03 19:23:48 29 4
gpt4 key购买 nike

我正在阅读 Preload并且对此感到非常兴奋,但是(正如我通过在 Google 上搜索更多内容所理解的那样)它们在我看来似乎具有相同的定义:

预载 :在服务器启动时加载已编译的 PHP 文件,并使所有定义的类和函数在 future 请求的上下文中永久可用(据我了解 here)

JIT : 在运行时编译文件而不是在执行之前

哪个对性能影响更大?特别是在框架上

最佳答案

这里的混淆是在“编译”的两种不同含义之间;或者,实际上,相同的含义 - 将高级程序转换为一组低级指令 - 对同一个程序应用两次。
自 PHP 4 起,人类编写的 PHP 代码已被自动编译为一种更抽象的语言,称为“操作码”。这些充当“虚拟机”的指令,但仍然非常高级:每个操作代码触发 Zend 引擎中的整个子例程。
OpCache自 5.5 版以来 PHP 包含的扩展不仅缓存这些操作码以节省重新编译的时间,它还通过操作它们来执行大量优化。预加载是该机制的一部分:它运行编译和优化步骤,并保存操作代码以供多个 PHP 进程重用。
然而,这些操作码距离 CPU 实际运行的代码还有很长的路要走。执行它们的虚拟机在技术上是一个解释器,通过一系列指令工作,甚至对于像 $x + $y 这样简单的事情也执行多个步骤。 .
PHP 8 中 JIT 的基本思想是用第二个编译器补充该解释器 - 这一次,从操作代码编译到实际的机器指令。更具体地说,JIT 编译器在运行时查看一段代码(因此是“及时”),并生成一组 CPU 指令来实现它。
现在您可能想知道为什么我们不尽早做这件事 - Just In Time 似乎与预加载相反!优点是 JIT 编译器可以查看代码的实际使用方式,而不是所有可能的使用方式。解释器查看 $x + $y 的操作码必须考虑这样一个事实,即每次代码运行时,这些变量可能是整数、浮点数、字符串或 +需要抛出错误。 JIT 编译器可以看到正在运行的程序通常将它们都作为整数,并为该场景编译一些快速代码。当其他场景出现时,JIT 编译器会返回给普通的解释器。

关于php - 在 PHP 7.4 上预加载和 JIT(即将在 PHP 8 上发布)有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58228426/

29 4 0