PHP 5.4 由Arnaud 引入了一个对三元式的优化方案.

 

我们都知道PHP用写时复制来对变量复制做性能优化, 而在以前的三元式中, 却每次都会复制, 这在操作数是大数组的情况下, 会造成性能问题:

<?php
$a = range(1, 1000);
$i = 0;

$start = microtime(true);
while (++$i < 1000) {
$b = isset($a)? $a : NULL;
}

var_dump(microtime(true) - $start);
相比, 我们采用if-else来做同样的功能:

<?php
$a = range(1, 1000);
$i = 0;

$start = microtime(true);
while (++$i < 1000) {
if (isset($a)) {
$b = $a;
} else {
$b = NULL;
}
}
var_dump(microtime(true) - $start);
前者在我的机器上, 运行时间为: float(0.0448620319366), 而采用if-else则是: float(0.000280006027222)

为此, Arnaud提供了一个patch, 来对三元式做了一个优化, 使得三元式不会每次都复制操作数, 在优化以后, 开头给的例子的运行时间降低为: float(0.00029182434082031)

The ternary operator always copies its second or third operand, which is very
slow compared to an if/else when the operand is an array for example:

$a = range(0,9);

// this takes 0.3 seconds here:

for ($i = 0; $i < 5000000; ++$i) {
if (true) {
$b = $a;
} else {
$b = $a;
}
}

// this takes 3.8 seconds:

for ($i = 0; $i < 5000000; ++$i) {
$b = true ? $a : $a;
}

I've tried to reduce the performance hit by avoiding the copy when possible
(patch attached).

Benchmark:

Without patch: (the numbers are the time taken to run the code a certain
amount of times)

$int = 0;
$ary = array(1,2,3,4,5,6,7,8,9);

true ? 1 : 0 0.124
true ? 1+0 : 0 0.109
true ? $ary : 0 2.020 !
true ? $int : 0 0.103
true ? ${'ary'} : 0 2.290 !
true ?: 0 0.091
1+0 ?: 0 0.086
$ary ?: 0 2.151 !
${'var'} ?: 0 2.317 !

With patch:

true ? 1 : 0 0.124
true ? 1+0 : 0 0.195
true ? $ary : 0 0.103
true ? $int : 0 0.089
true ? ${'ary'} : 0 0.103
true ?: 0 0.086
1+0 ?: 0 0.159
$cv ?: 0 0.090
${'var'} ?: 0 0.089

The array copying overhead is eliminated. There is however a slowdown in some
of the cases, but overall there is no completely unexpected performance hit as
it is the case currently.

不过, 还是要提醒下: PHP 5.4还处于开发阶段, 在最终release之前, 任何新特性都可能被调整或者更改. 如果大家有任何建议, 也欢迎反馈, 帮助我们使得PHP变得更好.

谢谢

时间: 2024-12-08 01:52:53

PHP 5.4 由Arnaud 引入了一个对三元式的优化方案.的相关文章

浏览器渲染过程与性能优化

大家都知道万维网的应用层使用了 HTTP 协议,并且用浏览器作为入口访问网络上的资源.用户在使用浏览器访问一个网站时需要先通过 HTTP 协议向服务器发送请求,之后服务器返回 HTML 文件与响应信息.这时,浏览器会根据 HTML 文件来进行解析与渲染(该阶段还包括向服务器请求非内联的 CSS 文件与 JavaScript 文件或者其他资源),最终再将页面呈现在用户面前. 现在知道了网页的渲染都是由浏览器完成的,那么如果一个网站的页面加载速度太慢会导致用户体验不够友好,本文通过详解浏览器渲染页面

激活引入非线性,池化预防过拟合(深度学习入门系列之十二)

系列文章: 一入侯门"深"似海,深度学习深几许(深度学习入门系列之一) 人工"碳"索意犹尽,智能"硅"来未可知(深度学习入门系列之二) 神经网络不胜语,M-P模型似可寻(深度学习入门系列之三) "机器学习"三重门,"中庸之道"趋若人(深度学习入门系列之四) Hello World感知机,懂你我心才安息 (深度学习入门系列之五) 损失函数减肥用,神经网络调权重(深度学习入门系列之六) 山重水复疑无路,最快下降

MySQL · 引擎特性 · InnoDB 事务子系统介绍

前言 在前面几期关于 InnoDB Redo 和 Undo 实现的铺垫后,本节我们从上层的角度来阐述 InnoDB 的事务子系统是如何实现的,涉及的内容包括:InnoDB的事务相关模块.如何实现MVCC及ACID.如何进行事务的并发控制.事务系统如何进行管理等相关知识.本文的目的是让读者对事务系统有一个较全面的理解. 由于不同版本对事务系统都有改变,本文的所有分析基于当前GA的最新版本MySQL5.7.9,但也会在阐述的过程中,顺带描述之前版本的一些内容.本文也会介绍5.7版本对事务系统的一些优

PostgreSQL修炼之道:从小工到专家

数据库技术丛书 PostgreSQL修炼之道:从小工到专家 唐成著             图书在版编目(CIP)数据 PostgreSQL修炼之道:从小工到专家/唐成著. -北京:机械工业出版社,2015.4 (数据库技术丛书) ISBN 978-7-111-49872-8 I. P- II. 唐- III. 关系数据库系统 IV. TP311.132.3 中国版本图书馆CIP数据核字(2015)第063966号 PostgreSQL修炼之道:从小工到专家 出版发行:机械工业出版社(北京市西城

java-优化-代码中的优化(1)

1.尽量使用final修饰符. 带有final修饰符的类是不可派生的.在JAVA核心API中,有许多应用final的例子,例如java.lang.String.为String类指定final防止了使用者覆盖length()方法.另外,如果一个类是final的,则该类所有方法都是final的.java编译器会寻找机会内联(inline)所有的final方法(这和具体的编译器实现有关).此举能够使性能平均提高50%. 2.尽量重用对象. 特别是String对象的使用中,出现字符串连接情况时应使用St

JVM 性能优化,第二部分:编译器

本文将是JVM 性能优化系列的第二篇文章,Java 编译器将是本文讨论的核心内容. 本文中,作者(Eva Andreasson)首先介绍了不同种类的编译器,并对客户端编译,服务器端编译器和多层编译的运行性能进行了对比.然后,在文章的最后介绍了几种常见的JVM优化方法,如死代码消除,代码嵌入以及循环体优化. Java最引以为豪的特性"平台独立性"正是源于Java编译器.软件开发人员尽其所能写出最好的java应用程序,紧接着后台运行的编译器产生高效的基于目标平台的可执行代码.不同的编译器适

《途客圈创业记:不疯魔,不成活》一一2.9 UX再造

2.9 UX再造 Alpha上线后,我们很快收到了不少用户的反馈,尤其是一些我们邀请到创新工场来的用户.大家反映问题比较多的地方是交互."旅行车"这个词让人摸不着头脑,添加完景点制作旅行计划之后的交互让没经过学习的用户几乎做不下去.我们研究了一下,决定对UX进行修改.这时,我们犯了一个严重的错误--没有把主要精力放在旅行计划的UX提升上. 原因是汪华在一次跟我们的评审会上指出我们的产品很不Web 2.0,即我们的网站在景点POI这一层,以信息呈现为主,无法调动用户的参与,用户产生内容的

Java虚拟机JVM性能优化(二):编译器_java

本文将是JVM 性能优化系列的第二篇文章(第一篇:传送门),Java 编译器将是本文讨论的核心内容. 本文中,作者(Eva Andreasson)首先介绍了不同种类的编译器,并对客户端编译,服务器端编译器和多层编译的运行性能进行了对比.然后,在文章的最后介绍了几种常见的JVM优化方法,如死代码消除,代码嵌入以及循环体优化. Java最引以为豪的特性"平台独立性"正是源于Java编译器.软件开发人员尽其所能写出最好的java应用程序,紧接着后台运行的编译器产生高效的基于目标平台的可执行代

每周一道数据结构(四)A*算法&amp;博弈树α-β剪枝

前阵子考试学了A*算法.博弈树和回溯,自己真是愚蠢至极,根本没就搞明白这些,所以对于这些算法问道的话就不能说清楚,也记不住,所以才有了这篇笔记.在这里感谢面试我的那位工程师~~ A*算法 一些重要的概念 启发式信息:用于帮助减少搜索量的与问题有关的信息或知识. 启发式搜索:使用启发信息指导的搜索过程叫做启发式搜索. 估价函数:定义在状态空间上的实值函数. open表:未扩展的节点 close表:已扩展或正在扩展的节点 用f(n)表示节点n的估价函数:    1. f(n)表示从起点到目标,经由节