要说明opcode cache与JIT的区别,得先明白,字节码,又叫中间码与机器码的区别

操作码(opcode)

一条机器指令。比如我们汇编语言写的一条操作语句。

机器码(machine code)

学名机器语言指令,有时也被称为原生码(Native Code),是电脑的CPU可直接解读的数据

机器码是电脑CPU直接读取运行的机器指令,运行速度最快,但是非常晦涩难懂,也比较难编写,一般从业人员接触不到。

而且机器码不支持跨平台,简单点将就是不同的CPU使用的机器码是不一样的。

字节码(bytecode)

是一种包含执行程序、由一序列 op 代码/数据对 组成的二进制文件。字节码是一种中间码,它比机器码更抽象,需要直译器转译后才能成为机器码的中间代码。

字节码主要为了实现特定软件运行和软件环境、与硬件环境无关。字节码的实现方式是通过编译器和虚拟机器。编译器将源码编译成字节码,特定平台上的虚拟机器将字节码转译为可以直接执行的指令。字节码的典型应用为Java bytecode,那PHP的就是一系列opcode组成的二进制文件。

字节码在运行时通过虚拟机(JAVA的JVM,PHP的Zend虚拟机)做一次转换, 生成机器指令, 因此能够更好的跨平台运行。

字节码是一种中间状态(中间码)的二进制代码(文件)。需要直译器转译后才能成为机器码。

通过介绍我们可以看到,CPU只能执行机器码,但为了实现应用跨硬件平台,我们就为不同的编程语言实现了一个虚拟机,而这个虚拟机将我们写的代码编译成二进制代码(文件),这个二进制代码就叫字节码,也叫中间码。Zend虚拟机编译好的字节码就叫opcode(其实是一系列opcode)。

接下来咱们再介绍opcode cache与JIT。

JIT

目前PHP还没有引入JIT技术,不过鸟哥说在下一个大版本的 PHP 可能带来JIT新特性。让我们拭目以待吧!不过JIT在JAVA生态中是很成熟的技术了,所以就说说JAVA的JIT。

JIT 是 just in time 的缩写, 也就是即时编译编译器。使用即时编译器技术,能够加速 Java 程序的执行速度。

通常通过 javac 将程序源代码编译,转换成 java 字节码,JVM 将字节码其翻译成对应的机器指令(机器码),逐条读入,逐条解释翻译。很显然,经过解释执行,其执行速度必然会比可执行的二进制字节码程序慢很多。为了提高执行速度,引入了 JIT 技术。

JIT 把翻译过的机器码保存起来,以备下次使用(这里面肯定有个类似与LRU的算法)。可见JIT要做的很简单,就是把中间码翻译成的机器码暂时(保存多久,怎么选择这里不做介绍)保存起来,这样再用到这个机器码的时候,就少了一次翻译。

opcode cache

光听名字就知道,就是将中间码(一系列opcode组成的二进制文件)缓存起来,引用官网的话:OPcache improves PHP performance by storing precompiled script bytecode in shared memory, thereby removing the need for PHP to load and parse scripts on each request.

那说说为什么需要opcode cache?

PHP代码的生命周期

从PHP解析器执行一个PHP脚本,到输出脚本内容,主要经历五个步骤:Zend引擎读取文件,词法分析,语法分析与语义分析、创建要中间码,执行中间码,如下图

 
每一次请求PHP脚本都会执行一遍以上步骤。如果PHP代码没有变化,那么opcode也不会变化,显然没有必要每次都生成opcode,于是我们可以把编译好的opcode缓存下来,以后如果PHP代码没有变,就直接访问缓存中编译好的opcode。
 
启用opcode缓存之后的流程图如下所示:
 
 

总结

简单点描述JAVA的JIT是用来缓存CPU执行的机器码的,opcode cache是用来缓存Zend虚拟机用的中间码的。

 

opcode cache与JIT的区别的更多相关文章

  1. RDD中cache和persist的区别

    通过观察RDD.scala源代码即可知道cache和persist的区别: def persist(newLevel: StorageLevel): this.type = { if (storage ...

  2. HttpContext.Cache和Application的区别

    原文:HttpContext.Cache和Application的区别 (转载)   应用程序级的Cache和Application用户会话级的Session application的缺点是在读取时最 ...

  3. cache 和 buffer的区别

    cache 和 buffer的区别: Cache:高速缓存,是位于CPU与主内存间的一种容量较小但速度很高的存储器.由于CPU的速度远高于主内存, CPU直接从内存中存取数据要等待一定时间周期,Cac ...

  4. Linux Free命令每个数字的含义 和 cache 、buffer的区别

    Linux Free命令每个数字的含义 和 cache .buffer的区别 我们按照图中来一细细研读(数字编号和图对应)1,total:物理内存实际总量2,used:这块千万注意,这里可不是实际已经 ...

  5. Spark中cache和persist的区别

    cache和persist都是用于将一个RDD进行缓存的,这样在之后使用的过程中就不需要重新计算了,可以大大节省程序运行时间. cache和persist的区别 基于Spark 1.6.1 的源码,可 ...

  6. 200 from memory cache / from disk cache / 304 Not Modified 区别

    三者情况有什么区别和联系,什么情况下会发生200 from memory cache 或 200 from disk cache 或 304 Not Modified? 200 from memory ...

  7. RDD的cache 与 checkpoint 的区别

    问题:cache 与 checkpoint 的区别? 关于这个问题,Tathagata Das 有一段回答: There is a significant difference between cac ...

  8. asp.net Application、 Session、Cookie、ViewState、Cache、Hidden 的区别

    这些对象都是用来保存信息的,包括用户信息,传递值的信息,全局信息等等.他们之间的区别: 1.Application对象 Application用于保存所有用户的公共的数据信息,如果使用Applicat ...

  9. buffer和cache有什么本质区别

    在free命令展示机器的内存消耗情况,会像这样展示

随机推荐

  1. C#对象序列化成XML,以及自定义标签名

    C#对象序列化操作: public class XMLHelper { /// <summary> /// 对象序列化成 XML String /// </summary> p ...

  2. IP通信基础学习第二周

    此周的课程学习应该算是我对此科目真正学校生涯的开始吧,尽管我对该科目仍感到很陌生. 课程一开头,老师就给我们简单的介绍了网络的定义.发展及其分类,重点讲了网络拓扑结构及其在局域网上具体的分层情况.该部 ...

  3. Oarcle之视图

    视图 什么是视图? (在 SQL 中,视图是基于 SQL 语句的结果集的可视化的表. 视图包含行和列,就像一个真实的表.视图中的字段就是来自一个或多个数据库中的真实的表中的字段.我们可以向视图添加 S ...

  4. Mysql error 1317导致从库复制断开

    环境 :Percona Server for MySQL 5.5.18 1. 报错日志: 171212 19:59:58 [ERROR] Slave SQL: Query partially comp ...

  5. Docker Compose 创建yml 简单试例

    Docker Compose 创建yml 简单试例 Docker Compose 文件使用格式版本需要与Docker版本对应可在官网内查找 查找地址:https://docs.docker.com/c ...

  6. flask --- 04 . 偏函数, 线程安全,栈堆,

    一.偏函数(partial) ①第一种 结果为: ② 第二种 二.线程安全 将空间转换成时间 问题: 1秒钟打印所有结果 threading.current_thread().ident :线程ID ...

  7. 2017年天梯赛LV2题目汇总小结

    Ⅰ.L2-021 点赞狂魔---STL应用 微博上有个"点赞"功能,你可以为你喜欢的博文点个赞表示支持.每篇博文都有一些刻画其特性的标签,而你点赞的博文的类型,也间接刻画了你的特性 ...

  8. oracle 连接问题汇总

    遇到的情况: 1/后台配置完好,若是连其他的库都是好的,当连接另外的库时,始终连接不上,这是需要考虑到服务端安装文件tnsnames文件中服务名在客户端的安装文件tnsnames文件中是否存在

  9. HTML基础(2)——边框

    边框:(尺寸 样式 颜色) div{border:1px solid red;} 样式可能的值: dotted(点状边框,在大多数浏览器里呈现实线) dashed(虚线.在大多数浏览器中呈现为实线) ...

  10. udp套接字及利用socketserver模块实现并发以及并发编程

    一:基于udp协议(数据报协议)的套接字:和tcp协议的套接字对比而言,由于udp是无链接的,所以先启动哪一端都不会报错,而且udp也不会有粘包 现象,所以对比下来,tcp协议的话传输数据更加可靠,但 ...