ホームページ  >  記事  >  バックエンド開発  >  PHP パフォーマンスの最適化 PHP 言語レベルのパフォーマンスの最適化 1

PHP パフォーマンスの最適化 PHP 言語レベルのパフォーマンスの最適化 1

WBOY
WBOYオリジナル
2016-06-13 12:10:551096ブラウズ

PHP パフォーマンスの最適化 - PHP 言語レベルのパフォーマンスの最適化 -


この問題については、まず PHP のパフォーマンスに影響を与える理由を知る必要があります。つまり、

1 どのような状況で PHP のパフォーマンスの問題が発生しますか?

1php構文の不正使用(PHP自体に付属する機能で対応可能な一部業務を含む)

2 php 言語で苦手なことを行う

3 php 言語と連携したサーバーは苦手です (もちろん、localhost の場合はローカル設定が貧弱なので、変更することをお勧めします(笑))

4ps p自体の欠点(PHP自体は出来ない)

5私たちにも分からない問題 (囧)

2 php パフォーマンスの問題の概要: php パフォーマンスの問題の解決方向

最も難しいものから最も難しいものまで:

1 Php 言語レベルのパフォーマンスの最適化

2 Php 周囲の問題 (mysql nginx|apache など) のパフォーマンスの最適化

3 Php 上級言語分析と最適化 ( ps) は主に、基礎となる c コードを指します)


以下は、PHP 言語レベルのパフォーマンスの最適化に関する説明の例です。 のタイトルで説明されている内容についてテストを実行します。 bad.php、goods.php

という 2 つのファイルを記述する必要があります。テストしたいのは、2 つの配列をマージする操作です (テストツール apache ab test)

bad.php

アイデア:

まず配列 1 をターゲット配列に 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

アイデア:

2 つの配列をランダムに生成し、それらをスクランブルします

を順序付けた後、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 可以带给您好像好用的功能)


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。