当前位置:  开发笔记 > 编程语言 > 正文

Zend引擎的优化

在PHP5.4的更新list上,有一句:提升了Zend引擎的性能,减少了内存占用.那么,到底是怎么提升的呢?避免不必要的Hashtable我们知道在PHP中,类的属性/静态属性/常量,都是保存在Hashtabl...">

  在PHP 5.4的更新list上, 有一句: 提升了Zend引擎的性能, 减少了内存占用.

  那么, 到底是怎么提升的呢?

  避免不必要的Hashtable

  我们知道在PHP中, 类的属性/静态属性/常量, 都是保存在Hashtable中的, 而在以前, 即使一个类没有申明属性/静态属性/常量, Zend引擎也会为他们分配Hashtable.

\

  而在现在, 这个过程被优化了, 只有在有元素的时候才会分配Hashtable.

  这样就避免一些emalloc/efree操作, 减少一些内存占用.

  四元式优化

  在PHP中, 真正执行的是Opcodes, 一个Opcodes包含3个固定的操作数, result, left, right, 在以前, 这三个操作数每一个都包含一个zval, 即使根本用不到的时候, 比如没有右操作数的时候, 还会为右操作数分配一个zval.

  而在现在, 所有的操作数将不再直接包含zval, 而是包含一个literal table的指针, 每一个op array都会包含一个literal table.

  并且znode也做了相应的调整.

  这样一来, 也能减少一些内存占用. 从之前的(32位操作系统)一个opcode占用72byte, 到现在的28byte.

  另外, 对于string, literal table还会保存一份这个string的预先计算的hash值, 避免了在运行时多次计算. 从而提高一部分性能.

  字面字符串

  就好像C语言中, 代码中的字面字符串, 会保存在一个固定段内(数据段), 在整个执行时期, 这些字符串都是常量字符串,不能被修改,不能被free.

  PHP也借鉴了这样的思想, 提出一个Internal string的概念, 在PHP代码中的字面量字符串, 将会一次分配, 并前在整个执行期都不能被修改.

  PHP在copy_zval, free zval等操作的时候, 会对internal string特别处理, 避免不必要的free和复制.

  并且这些字面量字符串的hash值将会被预先计算, 这样一来, 对于字符串比较 ==, 以及hashtable中的hash计算来说, 都可以直接使用这个预先计算的hash值, 从而能提高一部分性能.

  其他

  当然, 还有很多优化点, 比如优化了opcode, 减少了一些不必要的opcodes, 在此就不一一赘述了.

  对比

  下面是PHP开发小组内部测试的一些数据:

 

 

php-trunk patched inprovement
bench.php (sec) 4.31 3.49 19%
micro_bench.php (sec) 19.78 14.63 26%

一些实际的应用:

  php-trunk pathced improvement
blog (req/sec) 59.3 66.2 12%
drupal (req/sec) 1073.9 1084.8 1%
fw (req/sec) 105.3 111.8 6%
hello (req/sec) 5362.5 5351.4 0%
qdig (req/sec) 243.4 253.7 4%
typo3 (req/sec) 355.3 382.6 8%
wordpress (req/sec) 101.8 108.5 7%
xoops (req/sec) 70.3 78.5 12%
scrum (req/sec) 86.5 104.2 20%

从这些数据来看, 性能提升还是很明显的..


推荐阅读
  • 本文详细介绍了如何在Linux系统中搭建51单片机的开发与编程环境,重点讲解了使用Makefile进行项目管理的方法。首先,文章指导读者安装SDCC(Small Device C Compiler),这是一个专为小型设备设计的C语言编译器,适合用于51单片机的开发。随后,通过具体的实例演示了如何配置Makefile文件,以实现代码的自动化编译与链接过程,从而提高开发效率。此外,还提供了常见问题的解决方案及优化建议,帮助开发者快速上手并解决实际开发中可能遇到的技术难题。 ... [详细]
  • 如何使用Python高效绘制矩形图形
    本文详细介绍了如何利用Python的Turtle库高效绘制矩形图形,适合初学者快速上手。通过具体示例代码,帮助读者理解Turtle库的基本绘图方法和技巧,同时探讨了在不同应用场景中绘制矩形的实际操作,为后续复杂图形的绘制打下坚实基础。 ... [详细]
  • 程序员的“语言奇缘”续篇:计算中心管理员小C的非正式编程之旅
    (以下故事纯属虚构,旨在为编程爱好者提供一丝轻松时光,如有雷同,纯属巧合,敬请读者勿过度联想)在操作系统课程中,我们认识了计算中心的管理员小C。小C虽然并非科班出身,却凭借对编程的浓厚兴趣和不懈努力,逐渐在技术领域崭露头角。她不仅熟练掌握了多种编程语言,还经常利用业余时间开发一些实用的小工具,帮助同事提高工作效率,成为了团队中的技术明星。小C的故事激励着每一个热爱编程的人,证明了技术之路不问出处,关键在于不断学习与实践。 ... [详细]
  • 深入解析 C 语言与 C++ 之间的差异及关联
    深入解析 C 语言与 C++ 之间的差异及关联 ... [详细]
  • Web自动化测试:表单提交与页面跳转的高效实现
    Web自动化测试:表单提交与页面跳转的高效实现 ... [详细]
  • C语言中按位取反与按位与运算符的使用方法及应用场景解析
    位运算是一种基于二进制的计算方式,在系统软件开发中经常用于处理二进制位的相关问题。C语言提供了六种位操作运算符,专门用于对整型数据(包括带符号和无符号的char、short等)进行操作。本文详细解析了按位取反和按位与运算符的使用方法及其典型应用场景,帮助开发者更好地理解和应用这些运算符。 ... [详细]
  • 在Ubuntu系统中,由于预装了MySQL,因此无需额外安装。通过命令行登录MySQL时,可使用 `mysql -u root -p` 命令,并按提示输入密码。常见问题包括:1. 错误 1045 (28000):访问被拒绝,这通常是由于用户名或密码错误导致。为确保顺利连接,建议检查MySQL服务是否已启动,并确认用户名和密码的正确性。此外,还可以通过配置文件调整权限设置,以增强安全性。 ... [详细]
  • C++ 进阶:类的内存布局与虚函数类的实现细节
    C++ 进阶:类的内存布局与虚函数类的实现细节 ... [详细]
  • 本文详细探讨了C语言中`extern`关键字的简易编译方法,并深入解析了预编译、`static`和`extern`的综合应用。通过具体的代码示例,介绍了如何在不同的文件之间共享变量和函数声明,以及这些关键字在编译过程中的作用和影响。文章还讨论了预编译过程中宏定义的使用,为开发者提供了实用的编程技巧和最佳实践。 ... [详细]
  • Go语言实现Redis客户端与服务器的交互机制深入解析
    在前文对Godis v1.0版本的基础功能进行了详细介绍后,本文将重点探讨如何实现客户端与服务器之间的交互机制。通过具体代码实现,使客户端与服务器能够顺利通信,赋予项目实际运行的能力。本文将详细解析Go语言在实现这一过程中的关键技术和实现细节,帮助读者深入了解Redis客户端与服务器的交互原理。 ... [详细]
  • 在处理大规模并发请求时,传统的多线程或多进程模型往往无法有效解决性能瓶颈问题。尽管它们在处理小规模任务时能提升效率,但在高并发场景下,系统资源的过度消耗和上下文切换的开销会显著降低整体性能。相比之下,Python 的 `asyncio` 模块通过协程提供了一种轻量级且高效的并发解决方案。本文将深入解析 `asyncio` 模块的原理及其在实际应用中的优化技巧,帮助开发者更好地利用协程技术提升程序性能。 ... [详细]
  • 本文介绍了C语言中指针的基础知识及其初步应用。首先,文章详细解释了如何定义变量和指针,例如通过 `int i, j, k;` 定义整型变量,以及使用 `int *pi, *pj, *pk;` 来声明指向整型数据的指针。接着,探讨了变量和指针的初始化方法,强调了正确的初始化对于避免程序错误的重要性。此外,还简要介绍了指针在数组、函数参数传递等场景中的基本应用,为初学者提供了全面的入门指导。 ... [详细]
  • 在该项目中,参与者需结合历史使用模式和天气数据,以预测华盛顿特区自行车共享系统的租赁需求。数据分析部分首先涉及数据的收集,包括用户骑行记录和气象信息,为后续模型构建提供基础。通过深入的数据预处理和特征工程,确保数据质量和模型准确性,最终实现对自行车租赁需求的有效预测。 ... [详细]
  • 西北工业大学作为陕西省三所985和211高校之一,虽然在农业和林业领域不如某些顶尖院校,但在航空航天领域的实力尤为突出。该校的计算机科学专业在科研和教学方面也具有显著优势,是考研的理想选择。 ... [详细]
  • 本章深入探讨了指针的基础概念,详细解析了内存地址单元的运作机制。通过实例分析,读者将全面理解指针在内存管理中的关键作用及其应用技巧。 ... [详细]
author-avatar
好富饶_152
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有