要说明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. Flask最强攻略 - 跟DragonFire学Flask - 第十六篇 Flask-Migrate

    终于到了Flask-Migrate,之前在学习Flask-SQLAlchemy的时候,有的同学就提过类似的问题,Flask支持 makemigration / migrate 吗? 答案在这里该诉你, ...

  2. Mysql 集合链接查询

    MySQL NULL 值处理 需求:我们已经知道MySQL使用 SQL SELECT 命令及 WHERE 子句来读取数据表中的数据,但是当提供的查询条件字段为 NULL 时,该命令可能就无法正常工作. ...

  3. python 排序算法

    冒泡排序: 一. 冒泡排序的定义 冒泡排序(英语:Bubble Sort)是一种简单的排序算法.它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.遍历数列的工作是重复地进 ...

  4. [C++ Primer Plus] 第3章、处理数据(二)课后习题

    1 . 编写一个小程序,要求用户使用一个整数输出自己的身高(单位为厘米),然后将身高转换为米和厘米.该程序使用下划线字符来指示输入位置.另外,使用一个 const 符号常量来表示转换因子. #incl ...

  5. (转)A curated list of Artificial Intelligence (AI) courses, books, video lectures and papers

    A curated list of Artificial Intelligence (AI) courses, books, video lectures and papers. Updated 20 ...

  6. 函数func_get_args详解

    func_get_args ------获取一个函数的所有参数 function foo() { $numargs = func_num_args(); //参数数量 echo "参数个数是 ...

  7. Docker:bash: vi: command not found

    在使用docker容器时,有时候里边没有安装vim,敲vim命令时提示说:vim: command not found,这个时候就需要安装vim 操作步鄹: 1.apt-get update 2.ap ...

  8. spring-data-jpa——如果使用了one-to-many,many-to-one的注解,在Jackson进行json字符串化时出现错误的解决方案

    参考资料: http://blog.csdn.net/remote_roamer/article/details/51330843 http://blog.csdn.net/xiaodaiye/art ...

  9. 使用ByteArrayOutputStream解决IO乱码问题的踩坑记录

    经过:今天在用s3接口做ceph储存的时候,要实现一个io下载的接口.需要把InputStream转成byte[],一开始,是的写法是这样的: byte[] buf = new byte[(int) ...

  10. English trip EM2-LP-4B At school Teacher:Will

    课上内容(Lesson) 词汇(Key Word ) art  美术:艺术 business  商科 engineering  工程学 graphic design  平面造型学 history  历 ...