人们喜欢优化。它们很容易理解,很容易应用……。但是不久前,在查看Twig的pull请求时,我读到一篇关于PHP中三元运算符性能的有趣讨论。

你知道下面哪个片段是最快的吗(当然,它们做的是完全一样的)?// snippet 1

$tmp = isset($context['test']) ? $context['test'] : '';

// snippet 2

if (isset($context['test'])) {

$tmp = $context['test'];

} else {

$tmp = '';

}

正确的答案是:

视情况而定。大多数时候,它们的速度是一样的,你不需要在意。但是如果$context['test']包含大量数据,那么snippet 2要比snippet 1快得多。

下面是我用来测试不同场景的代码:$context = array('test' => true);

// optionally fill-in the test value with lots of data

for ($i = 0; $i < 100000; $i++) {

$context['test'][$i] = $i;

}

// you can also just create a big string

// $context = str_repeat(' ', 1000000);

// benchmark

$time = microtime(true);

for ($i = 0; $i < 100; $i++) {

// the snippet of code to benchmark

$tmp = isset($context['test']) ? $context['test'] : '';

}

printf("TIME: %0.2d\n", (microtime(true) - $time) * 1000);

注意,这里的绝对性能数字没有意义。我们只是想比较不同片段之间的速度。

在我的笔记本电脑上,snippet 1的运行时间超过2秒,而snippet 2的运行时间约为0.05ms。这是很大的不同!但是如果要测试的变量没有承载很多数据,那么速度几乎是一样的。

那么,为什么三元运算符在某些情况下会变慢呢?为什么它依赖于存储在测试变量中的值?

答案非常简单:

三元运算符总是复制值,而if语句不复制值。为什么?因为PHP使用了一种称为写时复制的技术:在为变量赋值时,PHP实际上不会创建变量内容的副本,直到对其进行修改。

当您编写像$tmp = $context['test']这样的语句时,几乎不会发生什么:$tmp变量只是成为$context['test']变量的引用;这就是为什么它非常快。但一旦你想修改变量,PHP需要复制原始的一个:$tmp = $context['test'];

// the copy happens now

$tmp[] = true;

// copy also happens if the original variable changes

// $context['test'][] = true;

综上所述,三元运算符的速度与复制语句结果所花费的时间直接相关,即使不是严格需要。复制100000个元素的数组需要时间。

如果您使用的是PHP 5.3,那么有一种更简单的方法可以使用新的?:construct:来表达我们的语句:$tmp = $context['test'] ?: '';

不过就性能而言,这个新构造与标准构造具有相同的缺点,即使PHP可能能够优化变量存在的情况。

php 三元运算符 区别,PHP三元运算符:快还是不快?相关推荐

  1. php 三元运算符 为空,PHP中三元运算符和Null合并运算符的简单比较

    在PHP中,三元运算符(?:)和Null合并运算符(??)的用法相似,那么它们之间有什么差异?下面本篇文章就来带大家了解一下三元运算符和Null合并运算符,希望对大家有所帮助. 三元运算符 三元运算符 ...

  2. 三元(三目)运算符解释

    三元运算符语法:条件 ? 结果1 : 结果2 说明:问号前面的位置是判断的条件,如果满足条件时结果1,不满足时结果2. 下面我们来详细探讨下. 今天在改论文在线的时候遇到了一个语句看不懂: 1 $if ...

  3. 【笔记】Java的运算符(赋值运算符号、一元运算符、算术运算符、关系运算符、自增与自减运算符、逻辑运算符、括号运算符、位运算符、三元(三目)运算符)、表达式与语句:简洁表达式

    文章目录 一.运算符 1.赋值运算符号 2.一元运算符 3.算术运算符 4.关系运算符 5.自增与自减运算符 6.逻辑运算符 7.括号运算符 8.位运算符 左移位: 右移位: 9.三元(三目)运算符 ...

  4. PHP三元运算符vs空合并运算符

    本文翻译自:PHP ternary operator vs null coalescing operator Can someone explain the differences between t ...

  5. python关系运算符中表示不等于的关系运算符_Python学习之------运算符表达式(关系运算符,逻辑运算符,三元表达式,成员关系)...

    @详细看Python学习手册第121页. 1,算术运算符(加减乘除) 2,关系运算符(又叫比较运算符 > < == != >= <=) xy,x>=y    大小比较,返 ...

  6. php三元运算符 echo_php的三元运算符

    简单记录一哈php的三元运算符的用法: 啥子是三元运算,即第一个表达式作为判断条件,在后面两个表达式中选择一个执行. 若判断成立,则执行第二个表达式,否则执行第三个表达式. 看到好多网友都说的不太全面 ...

  7. PHP三元(三目)运算符

    PHP三元(三目)运算符 语法格式: (expr1) ? (expr2) : (expr3) 当expr1为true时(成立),返回值为expr2,当expr1为false时(不成立),返回值为exp ...

  8. java中三元运算符_java中三元运算符详解

    三元运算符: 顾名思义,三元运算符需要三个操作数. 语法为:条件表达式?表达式1:表达式2. 说明:问号前面的位置是判断的条件,判断结果为bool型,为true时调用表达式1,为false时调用表达式 ...

  9. Python中is同一性运算符和==相等运算符区别

    2019独角兽企业重金招聘Python工程师标准>>> 在区分is和==这两种运算符区别之前,需要知道Python中对象包含的三个基本要素,分别是:id(身份标识).type(数据类 ...

最新文章

  1. ViewModelBase ObservableObject
  2. 关于中断的一点点认识
  3. ssh无密码登录设置(centos6系统下实现)
  4. ZKWeb网站框架的动态编译的实现原理
  5. 50matches:更准确的搜索引擎
  6. 传智Python视频_基础班+就业班
  7. 系统结构目录与正则表达式
  8. Mac下安装atari_py报错Exception: ROM is missing for pong
  9. 快应用开发教程【01】--环境与调试
  10. selenium实现失败重运行
  11. 计算机硬件的五大组成部分
  12. 编程中怎么理解抽象的概念
  13. 接入层-汇聚层组网设计配置案例——双归上行-负载
  14. 第7章 Stata相关性分析
  15. echarts青岛市地图下钻到区市及根据各个区市经纬度在各区市地图绘制散点图和道路线
  16. 【目标检测】K-means计算anchors
  17. 记忆mySQL增删改查
  18. linux3.10.46源码下载,Ubuntu11.10下编译android源码4.0.3
  19. 阿里云服务器与个人电脑TCP通信的调试
  20. 为何在数据库中将手机号设为int型却保存为2147483647

热门文章

  1. 数字有线机顶盒锁频流程
  2. 用CSS的perspective和transform将图片扭曲成类似PS的透视效果
  3. Yolov3训练模型没有框(理论上一定有用的解决方案)
  4. 光盘显示0字节可用_DVD-Cloner 2019 for Mac 共享版 – 强大的光盘刻录复制工具
  5. MySQL大批量删除时导致插入失败
  6. ASP.Net: EshineASPNet教程-身份证校验与正则
  7. 服务器硬盘和外储硬盘接口,服务器硬盘和普通硬盘有什么区别?
  8. Xcode 10 beta 版本迁移指南
  9. Android源码——Application源码解析
  10. vs2019调试器控制台启动后下次再点击start without debugging 出现应用程序无法正常启动(0xc0000142)