php 性能优化之php 语言级的性能优化一

对于这个问题首先我们要知道影响php的性能的原因是什么?也就是

1 什么情况下会出现php性能问题?

1php语法使用不当(包括某些业务可以使用php 本身自带的函数来处理)

2使用php语言做了它不擅长的事

3用php语言链接的服务器不给力(当然如果是localhost也就是你本地配置比较差哈,建议换本吧,哈哈)

4php自身的短板 (PHP 自身就做不了)

5我们也不知道的问题 (囧)

  2 php 性能问题简介之php的性能问题的解决方向

从困难度由浅到深分别为:

1 Php 语言级的性能优化

2 Php 周边问题的性能优化 (比如说mysql nginx|apache)

3 Php 语言资深分析,优化(ps 主要指的是底层的c代码)

下面针对php语言级的性能优化做实例讨论,对标题里面说的内容进行一个测试,接下来要书写两个文件 bad.php, goods.php

我们要测试的是合并两个数组的操作(测试工具 apache ab test)

bad.php

思路:

先将数组1逐个加入到目标数组中;

之后,遍历数组2,对比数组2的元素是否在数组1中出现,如果没有则插入到目标数组,否则忽略掉

<span style="font-size:14px;"><?php
//准备两个内容随机的数组
$arr1 = $arr2 = $arr_merged = array();
//接下来随机给两个数组赋值
for ( $i=0; $i<rand(1000,2000); $i++) {
	$arr1[] = rand();
}

for ( $i=0; $i<rand(1000,2000); $i++) {
	$arr2[] = rand();
}

//开始循环比较
foreach ( $arr1 as $v ) {
	$arr_merged[]  = $v;
}

foreach ( $arr2 as $v ) {
	if(!in_array($v, $arr_merged)){
		$arr_merged[]  = $v;
	}
}

var_dump($arr_merged);</span>

goods.php

思路:

随机生成两个数组,在打乱顺序

之后,使用array_merge 合并

<span style="font-size:14px;"><?php
//准备两个内容随机的数组
$arr1 = $arr2 = range(1000, 2000);
$arr_merged = array();
//接下来随机给两个数组赋值
shuffle($arr1);
shuffle($arr2);

$arr_merged = array_merge($arr1, $arr2);

var_dump($arr_merged);
</span>

3 使用 ab 测试两个php脚本的速度:(ps:惊人的时刻开始了)

bad.php

goods.php

对于这两个测试,我们明显的看出这的差的不是一点半点啊,在执行bad.php 的时候我明显的感觉电脑的风扇翁的一下,你懂得!

bad.php 每秒响应174个请求, 每个请求处理572ms

goods.php 每秒响应4050个请求, 每个请求处理24ms

ps: 如果还要小伙伴在使用bad的写法,赶快改掉它,小心不要你的领导知道哦!

4 究其原因

对于这个结果我也很吃惊,但是事实就在眼前,没办法啊,那么到底为什么会有这样的效果呢,咱们继续一探究竟:

*.php(php代码) -----Scanner(zend引擎逐行扫描变为zend可以识别的语法)----> exprs

-----parser(解析为opcode)-----> opcodes ------exec(执行最后输出)-------> output

可以知道 一个php文件执行zend需要先扫描,然后解析为opcode 在执行输出,问题就出在这里,当我们使用php自身的函数的时候其实他就属于zend 引擎,所以zend 解析起来就比较顺手,速度那叫个快(goods.php), 但是当执行bad.php 的时候就会比较慢,因为读别人写的代码肯定没有读自己写的代码快大家说对吧,所以还是使用原创,不要自己造轮子比较好啊!

多说一点,这也就是为什么现在好些Php扩展(比如 apc)都来缓存opcode 因为这样就少了扫描与解析的环节,那肯定是快了!

5 总结

优化点:少写代码,多用php自身提供的能力

性能问题:

自己写的代码冗余较多,可读性不好,并且性能低

为什么性能低?

php代码需要编译解析为底层语言, 这一过程每次请求都会 处理一遍,开销大。

好方法:

多使用php内置变量,常量, 函数(spl 可以带给您好像好用的功能)

时间: 2024-09-29 17:37:16

php 性能优化之php 语言级的性能优化一的相关文章

PHP性能优化学习笔记--语言级性能优化--来自慕课网Pangee http://www.imooc.com/learn/205

使用ab进行压力测试 ab -n行数 -c并发数 url 重点关注下面两点: 1.Request per secend : 每秒可接收的请求数 2.Time per request : 每次请求所耗费的时间 优化1.多使用PHP自身的功能(如PHP定义的函数.常量),尽量少自己造轮子,自己写的代码冗余较多,可读性不高,且性能低下 PHP每次接受请求后,都会进行编译成底层语言,C->汇编->机器语言,同时接受大量请求,每个请求都会执行一次编译 示例代码如下: bad.php          

【优化】MySQL千万级大表优化解决方案

问题概述 使用阿里云rds for MySQL数据库(就是MySQL5.6版本),有个用户上网记录表6个月的数据量近2000万,保留最近一年的数据量达到4000万,查询速度极慢,日常卡死.严重影响业务. 问题前提:老系统,当时设计系统的人大概是大学没毕业,表设计和sql语句写的不仅仅是垃圾,简直无法直视.原开发人员都已离职,到我来维护,这就是传说中的维护不了就跑路,然后我就是掉坑的那个!!! 我尝试解决该问题,so,有个这个日志. 方案概述 方案一:优化现有mysql数据库.优点:不影响现有业务

两周自制脚本语言-第11天 优化变量读写性能

第11天 优化变量读写性能 以变量值的读写为例,向读者介绍基于这种理念的语言处理器性能优化方式. 11.1 通过简单数组来实现环境 假如函数包含局部变量x与y,程序可以事先将x设为数组的第0个元素,将y设为第1个元素,以此类推.这样一来,语言处理器引用变量时就无需计算哈希值.也就是说,这是一个通过编号,而非名称来查找变量值的环境 为了实现这种设计,语言处理器需要在函数定义完成后遍历对应的抽象语法树节点,获取该节点使用的所有函数参数与局部变量.遍历之后程序将得到函数中用到的参数与局部变量的数量,于

亿级 Elasticsearch 性能优化

前言 最近一年使用 Elasticsearch 完成亿级别日志搜索平台「ELK」,亿级别的分布式跟踪系统.在设计这些系统的过程中,底层都是采用 Elasticsearch 来做数据的存储,并且数据量都超过亿级别,甚至达到百亿级别. 所以趁着有空,就花点时间整理一下具体怎么做 Elasticsearch 性能优化,希望能对 Elasticsearch 感兴趣的同学有所帮助. 背景 Elasticsearch 是一个基于 Lucene 的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于

oracle 11g亿级复杂SQL优化一例(数量级性能提升)

自从16年之后,因为工作原因,项目中就没有再使用oracle了,最近最近支持一个项目,又要开始负责这块事情了.最近在跑性能测试,配置全部调好之后,不少sql还存在性能低下的问题,主要涉及执行计划的不合理,以及相关pga隐含参数的优化.可能因为几年不接触的原因,略微有些生疏需要review了.这里以最近优化过的某个比较典型的例子为例(这里只讲思路.因为涉及到核心机密,不给出最终结果,16C [email protected]/45GB内存/fio 85/15 iops 8500/1500 配置,优

十亿级视频播放技术优化揭密

本文为转载文章,文章来自:王辉|十亿级视频播放技术优化揭密 QCon是由InfoQ主办的全球顶级技术盛会,每年在伦敦.北京.东京.纽约.圣保罗.上海.旧金山召开.自 2007年 3月份首次举办以来,已经有超万名高级技术人员参加过QCon大会.QCon内容源于实践并面向社区,演讲嘉宾依据热点话题,面向 5年以上工作经验的技术团队负责人.架构师.工程总监.高级开发人员分享技术创新和最佳实践. 4月18日性能优化面面观专题会议上,腾讯研发总监王辉以“十亿级视频播放技术优化揭秘”为主题,用QQ空间的日均

算法的优化(C语言描述)

算法的优化 算法的优化分为全局优化和局部优化两个层次.全局优化也称为结构优化,主要是从基本控制结构优化.算法.数据结构的选择上考虑:局部优化即为代码优化,包括使用尽量小的数据类型.优化表达式.优化赋值语句.优化函数参数.全局变量及宏的使用等内容. 一.全局优化 1.优化算法设计 例如,在排序中用快速排序或者堆排序代替插入排序或冒泡排序:用较快的折半查找代替顺序查找法等,都可以极大地提高程序的执行效率. 2.优化数据结构 例如在一堆随机存放的数中使用了大量的插入和删除指令,那么使用链表要快得多.数

CC2541是功率优化的真正系统级芯片(SoC)解决方案,适用于蓝牙低功耗(BLE)和专用的2.4GHz应用

CC2541是功率优化的真正系统级芯片(SoC)解决方案,适用于蓝牙低功耗(BLE)和专用的2.4GHz应用.该SOC芯片集成性能极好RF收发器以及标准工业级增强型8051内核,支持系统编程Flash,8KRAM及强大功能支持跟外设. NRF52832是深圳市动能世纪科技有限公司(www.dnsj88.com)从原厂渠道代理经销. 深圳市动能世纪科技有限公司成立于2000年,是一家IC集成电路销售的独立分销商,一直专注于经销世界著名的电子元器件,同时为客户提供被动元器件的配套.公司拥有一支专业且

Android 性能优化之内存泄漏检测以及内存优化(上)

在 Java 中,内存的分配是由程序完成的,而内存的释放则是由 Garbage Collecation(GC) 完成的,Java/Android 程序员不用像 C/C++ 程序员一样手动调用相关函数来管理内存的分配和释放,虽然方便了很多,但是这也就造成了内存泄漏的可能性,所以记录一下针对 Android 应用的内存泄漏的检测,处理和优化的相关内容,上篇主要会分析 Java/Android 的内存分配以及 GC 的详细分析,中篇会阐述 Android 内存泄漏的检测和内存泄漏的常见产生情景,下篇会