php 效能最佳化之php 語言級的效能最佳化一

來源:互聯網
上載者:User


   對於這個問題首先我們要知道影響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 可以帶給您好像好用的功能)


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.