php7性能
『壹』 php7的PHP7特性
PHP 7.0.0 Alpha 1 使用新版的ZendEngine引擎,帶來了許多新的特性,以下是不完全列表: 性能提升:PHP7比PHP5.6性能提升了兩倍。 Improved performance: PHP 7 is up to twice as fast as PHP 5.6 全面一致的64位支持。 Consistent 64-bit support 以前的許多致命錯誤,現在改成拋出異常。Many fatal errors are now Exceptions 移除了一些老的不在支持的SAPI(伺服器端應用編程埠)和擴展。Removal of old and unsupported SAPIs and extensions 新增了空接合操作符。The null coalescing operator (??) 新增加了結合比較運算符。Combined comparison Operator (<=>) 新增加了函數的返回類型聲明。Return Type Declarations 新增加了標量類型聲明。Scalar Type Declarations 新增加匿名類。Anonymous Classes
『貳』 PHP7卓越性能背後的原理有哪些
一 zval使用棧內存
在Zend引擎和擴展中,經常要創建一個PHP的變數,底層就是一個zval指針。之前的版本都是通過MAKE_STD_ZVAL動態的從堆上分配一個zval內存。而PHP7可以直接使用棧內存。PHP代碼中創建的變數也進行了優化,PHP7直接在棧內存上預分配zval。這樣節約了大量內存分配和內存管理的操作。
PHP5
zval *val; MAKE_STD_ZVAL(val);
PHP7
zval val;
二 zend_string存儲hash值,array查詢不再需要重復計算hash
PHP7為字元串單獨創建了新類型叫做zend_string,除了char *指針和長度之外,增加了一個hash欄位,用於保存字元串的hash值。PHP中array是核心數據結構,PHP程序中往往都有大量的$array[$key]操作,雖然hashtable查找的時間復雜度是O(1),但$key要轉為hash值是要經過計算的。不僅僅是array操作,實際上PHP底層對於類屬性、類方法、函數,訪問時都要先通過hashtable查找到對應的指針,再執行對應的操作。PHP7之前Zend引擎會有大量的CPU時間用於計算hash值。
實際上PHP程序運行起來之後,大部分情況下$key的值都是不變的。PHP7乾脆將這個hash值保存起來,下次直接使用,這樣就節省了大量的hash計算操作,PHP的hashtable與C數組的性能一致。
三 hashtable桶內直接存數據
PHP5的hashtable每個元素都是一個 Bucket *,而PHP7直接存Bucket,減少了內存申請次數,提升了Cache命中率和內存訪問速度。
四 zend_parse_parameters改為宏實現
PHP的C擴展函數與PHP中的變數進行參數輸入時,要使用zend_parse_parameters()函數,這個函數根據一個字元串參數找到對應PHP的zval指針,然後進行賦值。 這個函數實際上有一定的性能消耗。PHP7直接使用宏替換了zend_parse_parameters函數,C擴展中不再需要使用zend_parse_parameters進行逐個參數的查找,宏展開後自動會實現參數賦值。僅此一項就提升了5%的性能。
五 新增加4種OPCODE
很多PHP程序中會大量使用call_user_function, is_int/string/array, strlen , defined 函數。PHP5 都是以擴展函數的方式提供,PHP7中這4類函數改成ZendVM的OPCODE指令,執行更快。
六 其他更多優化
除了上面5個主要優化點之外,PHP7還有其他更多的細節性能優化。如基礎類型int、float、bool等改為直接進行值拷貝,排序演算法改進,PCRE with JIT,execute_data和opline使用全局寄存器等等。PHP7對性能的優化會繼續進行下去。
『叄』 php7 性能怎麼提升
1.用單引號來包含字元串要比雙引號來包含字元串更快一些。因為PHP會在雙引號包圍的字元串中搜尋變數,單引號則不會。
2.如果能將類的方法定義成static,就盡量定義成static,它的速度會提升將近4倍。
3.$row['id'] 的速度是$row[id]的7倍。
4.echo 比 print 快,並且使用echo的多重參數(譯註:指用逗號而不是句點)代替字元串連接,比如echo $str1,$str2。
5.在執行for循環之前確定最大循環數,不要每循環一次都計算最大值,最好運用foreach代替。
6.注銷那些不用的變數尤其是大數組,以便釋放內存。
7.盡量避免使用__get,__set,__autoload。
8.require_once()代價昂貴。
9.include文件時盡量使用絕對路徑,因為它避免了PHP去include_path里查找文件的速度,解析操作系統路徑所需的時間會更少。
10.如果你想知道腳本開始執行(譯註:即伺服器端收到客戶端請求)的時刻,使用$_SERVER[『REQUEST_TIME']要好於time()。
11.函數代替正則表達式完成相同功能。
12.str_replace函數比preg_replace函數快,但strtr函數的效率是str_replace函數的四倍。
13.如果一個字元串替換函數,可接受數組或字元作為參數,並且參數長度不太長,那麼可以考慮額外寫一段替換代碼,使得每次傳遞參數是一個字元,而不是只寫一行代碼接受數組作為查詢和替換的參數。
14.使用選擇分支語句(譯註:即switch case)好於使用多個if,else if語句。
15.用@屏蔽錯誤消息的做法非常低效,極其低效。
16.打開apache的mod_deflate模塊,可以提高網頁的瀏覽速度。
17.資料庫連接當使用完畢時應關掉,不要用長連接。
18.錯誤消息代價昂貴。
19.在方法中遞增局部變數,速度是最快的。幾乎與在函數中調用局部變數的速度相當。
20.遞增一個全局變數要比遞增一個局部變數慢2倍。
21.遞增一個對象屬性(如:$this->prop++)要比遞增一個局部變數慢3倍。
『肆』 PHP7的性能,正式版會不會秒了其他腳本語言
> PHP7( phpng)的性能,正式版會不會秒了其他腳本語言?
和其他腳本語言比沒有大多意義,因為應用場景不同。你不會用PHP像python那樣寫系統管理腳本,也不會用PHP跑Rails。
更有意義的,是和其他PHP版本的縱向比較。具體結果可Google: http://lmgtfy.com/?q=phpng+benchmark
> 一直想學runy、python,node.js但是正式用到機會不多。
一定要正式用才能逼自己學嗎?
Ruby都拼不對。
> 所以一直就看看語法就放棄了。一直沒深入。
就算是學習語法,光看是沒用的,更重要的是做。
至於深入,學習語言的第一步是寫出沒有語法錯誤、可以完成任務的程序。一步登天想第一天就100% best practice是不可能的,瘦子吃不成胖子。至於更加深入的,比如語言的內部實現,我覺得90%的情況下即使你不去了解,問題也不大。也有小概率的情況的確碰到坑了,那麼認真去挖一下坑,收獲也會很大。
> 沒深入學,其實跟沒學一樣,幾個月看看語法,扔了,過幾個月又想學,又看看語法,又扔了。
沒什入學不代表跟沒學一樣,能用、增加了知識就能體現學習的價值。比如我學Haskell,書就看了幾章,很多很高深的概念都不懂,但這不影響我欣賞Haskell,也開闊了我在FP方面的知識面。
你就是懶,沒恆心。
> 聽說PHP7性能太牛B後,更讓我懶得深入了。。
不是很理解這個邏輯。
> 但是好像不會點小眾語言,就好像不上檔次一樣。
1. PHP不是小眾語言。
2. 「上檔次」如何定義?能吃嗎?
> 一直想深入學,一直被打消念頭。怎麼樣才能破這個局呢?
1. (optional) 讀點心靈雞湯,打點雞血
2. 靜下心來學,寫點程序練
『伍』 鳥哥:讓php7達到最高性能的幾個tips
1. Opcache
記得啟用Zend Opcache, 因為PHP7即使不啟用Opcache速度也比PHP-5.6啟用了Opcache快, 所以之前測試時期就發生了有人一直沒有啟用Opcache的事情. 啟用Opcache非常簡單, 在php.ini配置文件中加入:
zend_extension=opcache.so
opcache.enable=1
opcache.enable_cli=1"
2. 使用新的編譯器
使用新一點的編譯器, 推薦GCC 4.8以上, 因為只有GCC 4.8以上PHP才會開啟Global Register for opline and execute_data支持, 這個會帶來5%左右的性能提升(Wordpres的QPS角度衡量)
其實GCC 4.8以前的版本也支持, 但是我們發現它支持的有Bug, 所以必須是4.8以上的版本才會開啟這個特性.
3. HugePage
前面文章介紹過
4. Opcache file cache
開啟Opcache File Cache(實驗性), 通過開啟這個, 我們可以讓Opcache把opcode緩存緩存到外部文件中, 對於一些腳本, 會有很明顯的性能提升.
在php.ini中加入:
opcache.file_cache=/tmp
這樣PHP就會在/tmp目錄下Cache一些Opcode的二進制導出文件, 可以跨PHP生命周期存在.
5. PGO
如果你的PHP是專門為一個項目服務, 比如只是為你的Wordpress, 或者drupal, 或者其他什麼, 那麼你就可以嘗試通過PGO, 來提升PHP, 專門為你的這個項目提高性能.
具體的, 以wordpress 4.1為優化場景.. 首先在編譯PHP的時候首先:
$ make prof-gen
然後用你的項目訓練PHP, 比如對於Wordpress:
$ sapi/cgi/php-cgi -T 100 /home/zk/local/www/htdocs/ wordpress/index.php >/dev/null
也就是讓php-cgi跑100遍wordpress的首頁, 從而生成一些在這個過程中的profile信息.
最後:
$ make prof-clean$ make prof-use && make install
這個時候你編譯得到的PHP7就是為你的項目量身打造的最高性能的編譯版本.
『陸』 php7的性能會趕上java嗎
當然不可能,弱類型動態語言性能永遠不可能比得上強類型靜態語言。。解釋型語言也永遠不可能比編譯型語言更快。。
這道理其實很簡單。。。你告訴計算機的內容越詳細,計算機需要自己去「猜」的東西就越少。。。自然性能就越好。。。別說PHP7,就算將來發展到PHP999,只要它是動態語言,只要它是解釋型, 它就絕對不可能在性能上超越強JAVA。。。這是從原理上就不可能辦到的事情。。。
『柒』 php7新特性有哪些
1、性能提升:PHP7比PHP5.6性能提升了兩倍。 Improved performance: PHP 7 is up to twice as fast as PHP 5.6
2、全面一致的64位支持。 Consistent 64-bit support
3、以前的許多致命錯誤,現在改成拋出異常。Many fatal errors are now Exceptions
4、移除了一些老的不在支持的SAPI(伺服器端應用編程埠)和擴展。Removal of old and unsupported SAPIs and extensions
5、新增了空接合操作符。The null coalescing operator (??)
6、新增加了結合比較運算符。Combined comparison Operator (<=>)
7、新增加了函數的返回類型聲明。Return Type Declarations
8、新增加了標量類型聲明。Scalar Type Declarations
9、新增加匿名類。Anonymous Classes
『捌』 關於PHP5與PHP7的若干問題
一、
1、在Zend引擎和擴展中,經常要創建一個PHP的變數,底層就是一個zval指針。之前的版本都是通過MAKE_STD_ZVAL動態的從堆上分配一個zval內存。而PHP7可以直接使用棧內存。PHP代碼中創建的變數也進行了優化,PHP7直接在棧內存上預分配zval。這樣節約了大量內存分配和內存管理的操作。
2、zend_string存儲hash值,array查詢不再需要重復計算hash
3、PHP5的hashtable每個元素都是一個
Bucket
*,而PHP7直接存Bucket,減少了內存申請次數,提升了Cache命中率和內存訪問速度。
4、PHP的C擴展函數與PHP中的變數進行參數輸入時,要使用zend_parse_parameters()函數,這個函數根據一個字元串參數找到對應PHP的zval指針,然後進行賦值。
這個函數實際上有一定的性能消耗。PHP7直接使用宏替換了zend_parse_parameters函數,C擴展中不再需要使用zend_parse_parameters進行逐個參數的查找,宏展開後自動會實現參數賦值。僅此一項就提升了5%的性能。
5、很多PHP程序中會大量使用call_user_function,
is_int/string/array,
strlen
,
defined
函數。PHP5
都是以擴展函數的方式提供,PHP7中這4類函數改成ZendVM的OPCODE指令,執行更快。
除了上面5個主要優化點之外,PHP7還有其他更多的細節性能優化。如基礎類型int、float、bool等改為直接進行值拷貝,排序演算法改進,PCRE
with
JIT,execute_data和opline使用全局寄存器等等。PHP7對性能的優化會繼續進行下去。
二、有一群人,
創建了一個PHP6的項目,
主要的目的是為PHP引擎增加Unicode支持.
當時開發者們同時維護5和6的開發,
慢慢的大家發現新功能都等著提交給6,
而6因為開發速度慢,
導致很多新特性沒法提交,
狀態很不理想.
再後來6就沒人開發了
三、不太了解、我只用git下的php7主幹代碼
『玖』 php7 數組和對象 哪個性能好
1.少用數組
1.大項目不利於維護,萬一哪天修改了數據結構,改key,改到你懷疑人生,關鍵idea不給你報錯,你只能自己找
2.整體效率也不是很高,比實體對象慢
3.特占內存
2.多用實體對象,少用匿名對象
1.匿名對象效率比數組還低,佔用內存更高,速度還慢,還不利於維護
2.實體對象可以利於維護,後期數據結構修改了,至少idea能給你報錯,能快速定位問題
『拾』 php7與php5的區別
php5與php7之間的區別:
1、性能提升:PHP7比PHP5.0性能提升了兩倍。
2、以前的許多致命錯誤,現在改成拋出異常。
3、PHP 7.0比PHP5.0移除了一些老的不在支持的SAPI(伺服器端應用編程埠)和擴展。
4、PHP 7.0比PHP5.0新增了空接合操作符。
5、PHP 7.0比PHP5.0新增加了結合比較運算符。
6、PHP 7.0比PHP5.0新增加了函數的返回類型聲明。
7、PHP 7.0比PHP5.0新增加了標量類型聲明。
8、PHP 7.0比PHP5.0新增加匿名類。
9、錯誤處理和64位支持