亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專(zhuān)欄INFORMATION COLUMN

【PHP7源碼分析】PHP7到底有多快,基準(zhǔn)測(cè)試與特性分析告訴你

Towers / 2627人閱讀

摘要:我們修改上面代碼,再來(lái)看下返回值類(lèi)型限制的情況運(yùn)行結(jié)果這段代碼我們額外聲明了返回值的類(lèi)型為型。對(duì)函數(shù)返回值的聲明做了擴(kuò)充,可以定義其返回值為,無(wú)論是否開(kāi)啟嚴(yán)格模式,只要函數(shù)中有以外的其他語(yǔ)句都會(huì)報(bào)錯(cuò)。

順風(fēng)車(chē)運(yùn)營(yíng)研發(fā)團(tuán)隊(duì) 王坤 發(fā)表至21CTO公眾號(hào)(https://mp.weixin.qq.com/s/ph...)

PHP是一種跨平臺(tái)開(kāi)源語(yǔ)言,也是迄今為止最流行的Web開(kāi)發(fā)語(yǔ)言,全球有超過(guò)80%的網(wǎng)站由 PHP 驅(qū)動(dòng)。自1994年由Rasmus Lerdorf 創(chuàng)建以來(lái)已走過(guò)20多年,經(jīng)歷了6個(gè)大版本的更迭。下面就來(lái)了解PHP7帶來(lái)的新特性。

2015年夏天,備受矚目的PHP7發(fā)布了第一個(gè)Alpha版本。之后,經(jīng)過(guò)大概3個(gè) Beta 版本和8個(gè)RC 版本,2016年1月 PHP7正式發(fā)布。PHP7是PHP一個(gè)非常重要的版本,相對(duì)于PHP5.x 版本,有著非常大的革新,尤其是在性能方面。如果讀者的網(wǎng)站是使用的 PHP5.x,那么使用PHP7后將幾乎無(wú)成本的得到一倍的性能提升。感謝開(kāi)發(fā)者!

1. PHP7到底有多快!
下面我們來(lái)測(cè)試下PHP7性能提升到底有多少。本地環(huán)境下以相同的編譯參數(shù)分別安裝PHP5.5.38、PHP7的第一個(gè)正式版本7.0.2和7.1.0版本,在CLI 模式下運(yùn)行PHP 源碼中的基準(zhǔn)測(cè)試腳本。

(1)測(cè)試環(huán)境

本地搭建的vagrant虛擬機(jī),操作系統(tǒng)CentOS7,單核CPU 2.00GHz,內(nèi)存1GB。

(2)基準(zhǔn)測(cè)試指標(biāo)

q Time——執(zhí)行時(shí)間,以秒為單位;

q %rel, gain——相對(duì)于上一版本節(jié)省的執(zhí)行時(shí)間;

q %abs, gain——與 PHP 5.5.38 相比腳本節(jié)省的執(zhí)行時(shí)間。

測(cè)試結(jié)果如表1-1所示。


表1-1 測(cè)試結(jié)果

由上邊的測(cè)試結(jié)果可以看出來(lái),PHP7.1.0 的基準(zhǔn)性能幾乎是PHP5.5.38的3倍左右,開(kāi)啟了 opcache 的情況下更是達(dá)到了4.4倍之多,這是一個(gè)非常顯著的提升,這些性能提升是如何做到的呢,本書(shū)后續(xù)的章節(jié)將一一介紹。

注意:這里的測(cè)試是純 CPU 的基準(zhǔn)測(cè)試,5次運(yùn)行取平均值,不包括其他方面的測(cè)試,在實(shí)際的項(xiàng)目或者其他運(yùn)行環(huán)境下可能有所差異。

2. PHP7炫目新特性

PHP7 除了在性能方面的極大提升,還添加了很多新的特性,如太空船操作符、標(biāo)量類(lèi)型聲明、返回值的類(lèi)型聲明、全局的 throwable 接口、抽象語(yǔ)法樹(shù)等,下邊我們分別介紹。

(1)太空船操作符

太空船操作符用于比較兩個(gè)表達(dá)式。例如,當(dāng) $a 小于、等于或大于 $b 時(shí)它分別返回 -1、0 或 1。比較的原則沿用 PHP 的常規(guī)比較規(guī)則進(jìn)行。

 1; // 0

echo 1 <=> 2; // -1

echo 2 <=> 1; // 1

 

// 浮點(diǎn)數(shù)

echo 1.5 <=> 1.5; // 0

echo 1.5 <=> 2.5; // -1

echo 2.5 <=> 1.5; // 1

 

// 字符串

echo "a" <=>"a"; // 0

echo "a" <=>"b"; // -1

echo "b" <=>"a"; // 1

(2)標(biāo)量類(lèi)型聲明和返回值的類(lèi)型聲明

PHP7 可以對(duì)下面幾種類(lèi)型的參數(shù)做聲明:字符串(string)、整型 (int)、浮點(diǎn)型 (float) 以及布爾型 (bool)。注意參數(shù)類(lèi)型聲明不受制于默認(rèn)模式和嚴(yán)格模式,都可以聲明。默認(rèn)模式下,當(dāng)傳入的參數(shù)不符合聲明類(lèi)型時(shí),會(huì)首先嘗試轉(zhuǎn)換類(lèi)型;而嚴(yán)格模式下,則直接報(bào)錯(cuò)。

例如下面的代碼:


當(dāng)注釋掉第二行代碼,程序才可以正常運(yùn)行——PHP 會(huì)首先嘗試把 "3.1" 轉(zhuǎn)為 int 型的 3,然后再執(zhí)行(注:這里的類(lèi)型轉(zhuǎn)換僅受制于可轉(zhuǎn)換的類(lèi)型,例如不能把 "a" 轉(zhuǎn)為 int 型)。但是當(dāng)開(kāi)啟嚴(yán)格模式后,代碼會(huì)直接報(bào)錯(cuò)。因?yàn)楹瘮?shù)的參數(shù)被聲明為 int 型,但是傳入的參數(shù)中包含一個(gè)string型和一個(gè)float型。

我們修改上面代碼,再來(lái)看下返回值類(lèi)型限制的情況:


這段代碼我們額外聲明了返回值的類(lèi)型為int型。如果返回值的類(lèi)型不是 int型,在默認(rèn)模式下,PHP會(huì)首先嘗試轉(zhuǎn)換返回值的類(lèi)型為 int型,如果不能轉(zhuǎn)換則會(huì)直接報(bào)錯(cuò)。

PHP7.1 對(duì)函數(shù)返回值的聲明做了擴(kuò)充,可以定義其返回值為 void,無(wú)論是否開(kāi)啟嚴(yán)格模式,只要函數(shù)中有 return; 以外的其他 return 語(yǔ)句都會(huì)報(bào)錯(cuò)。

注:參數(shù)類(lèi)型不可以是 void。


PHP7.1.0 對(duì)參數(shù)類(lèi)型和返回值類(lèi)型還有進(jìn)一步的支持,其類(lèi)型可以是可空類(lèi)型,在參數(shù)或返回值類(lèi)型聲明前邊加上 “?”, 表示返回值要么是 null 要么是聲明的類(lèi)型:


(3)null合并操作符

在 PHP7 之前,我們會(huì)經(jīng)常寫(xiě)這樣的代碼:


PHP7 提供了一個(gè)新的語(yǔ)法糖 ??,如果變量存在且值不為NULL,它會(huì)返回自身的值,否則返回它的第二個(gè)操作數(shù)。我們可以這樣改寫(xiě)代碼:


當(dāng)代碼中有連續(xù)的三元運(yùn)算符的時(shí)候還可以像下邊這樣寫(xiě):


看起來(lái)是不是簡(jiǎn)化了很多?

(4)常量數(shù)組

PHP7 之前是無(wú)法通過(guò) define 來(lái)定義一個(gè)數(shù)組常量的,PHP7 支持了這個(gè)操作:


(5)namespace 批量導(dǎo)入

PHP7 之前如果要導(dǎo)入一個(gè) namespace 下的多個(gè) class ,我們需要這樣寫(xiě):


在 PHP7 中支持批量導(dǎo)入:


(6)throwable 接口

在 PHP7 之前,如果代碼中有語(yǔ)法錯(cuò)誤,或者 fater error 時(shí),程序會(huì)直接報(bào)錯(cuò)退出,但是在 PHP7 中有了改變。PHP7 實(shí)現(xiàn)了全局 throwable 接口,原來(lái)的 Exception 和部分 Error 實(shí)現(xiàn)了該接口。這種 Error 可以像 Exception 異常一樣被第一個(gè)匹配的 try / catch 塊捕獲。如果沒(méi)有匹配的 catch 塊,則調(diào)用異常處理函數(shù)進(jìn)行處理。如果尚未注冊(cè)異常處理函數(shù),則按照傳統(tǒng)方式處理(Fatal Error)。

Error 類(lèi)并非繼承自 Exception 類(lèi),所以不能用 catch (Exception$e) { ... } 來(lái)捕獲 Error??梢杂?catch (Error $e) { ... },或者通過(guò)注冊(cè)異常處理函數(shù)(set_exception_handler())來(lái)捕獲 Error:


(7)Closure::call()

在 PHP7 之前我們需要?jiǎng)討B(tài)給一個(gè)對(duì)象添加方法時(shí)可以通過(guò) Closure 來(lái)復(fù)制一個(gè)閉包對(duì)象綁定到一個(gè) $this 對(duì)象和類(lèi)作用域:

num + 1;

};

 

$test = $f->bindTo(new Test,"Test");

echo $test();

// 2

在 PHP7 中新添加了 Closure::call(),可以通過(guò) call 來(lái)暫時(shí)綁定一個(gè)閉包對(duì)象到 $this 對(duì)象并調(diào)用它:

num + 1;

};

 

echo $f->call(new Test);

// 2

(8)intdiv 函數(shù)

PHP7 還增加了一個(gè)新的整除函數(shù),代碼中不需要再手動(dòng)轉(zhuǎn)一下了:


(9)list 的方括號(hào)寫(xiě)法

我們知道可以通過(guò) list 來(lái)實(shí)現(xiàn)解構(gòu)賦值,如下:


PHP7.1.0 對(duì)其做了進(jìn)一步的優(yōu)化,可以寫(xiě)成如下方式:


注意:這里的 [] 并不是數(shù)組的意思,只是 list 的簡(jiǎn)略形式。

除了上文這些,PHP7 還有很多其他的改變和特性。例如 foreach 遍歷數(shù)組不再修改內(nèi)部指針、移除了 ASP 和 script PHP 標(biāo)簽、移除了$HTTP_RAW_POST_DATA、匿名類(lèi)、類(lèi)常量可見(jiàn)性等,讀者可以自行嘗試。

本文節(jié)選自《PHP 7底層設(shè)計(jì)與源碼實(shí)現(xiàn)》

推薦理由:

滴滴出行專(zhuān)家聯(lián)合撰寫(xiě),PHP領(lǐng)域大咖夏緒宏、韓天峰、王晶、謝華亮(黑夜路人)、伍星聯(lián)袂推薦

全面吃透PHP內(nèi)核架構(gòu)、核心實(shí)現(xiàn)與內(nèi)存管理、詞法與句法解析、Zend 虛擬機(jī)、函數(shù)及關(guān)鍵擴(kuò)展等設(shè)計(jì)細(xì)節(jié)與源碼實(shí)現(xiàn)

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/28967.html

相關(guān)文章

  • Java 8 的 JVM 多快?Fork-Join 性能基準(zhǔn)測(cè)試

    摘要:這減輕了手動(dòng)重復(fù)執(zhí)行相同基準(zhǔn)測(cè)試的痛苦,并簡(jiǎn)化了獲取結(jié)果的流程。處理項(xiàng)目的代碼并從標(biāo)有注釋的方法處生成基準(zhǔn)測(cè)試程序。用和運(yùn)行該基準(zhǔn)測(cè)試得到以下結(jié)果。同時(shí),和的基線(xiàn)測(cè)試結(jié)果也有略微的不同。 Java 8 已經(jīng)發(fā)布一段時(shí)間了,許多開(kāi)發(fā)者已經(jīng)開(kāi)始使用 Java 8。本文也將討論最新發(fā)布在 JDK 中的并發(fā)功能更新。事實(shí)上,JDK 中已經(jīng)有多處java.util.concurrent 改動(dòng),但...

    Euphoria 評(píng)論0 收藏0
  • Badoo 告訴切換到 PHP7 節(jié)省了 100 萬(wàn)美元

    摘要:我們?yōu)榱颂幚磉@些挑戰(zhàn),提出了一個(gè)新的引用測(cè)試框架當(dāng)然,也是開(kāi)源的,并且在整個(gè)過(guò)程中節(jié)省了上百萬(wàn)美元。另一方面,被證實(shí)有一些嚴(yán)重的缺點(diǎn)部署困難而且慢。在緩存刷新期間,當(dāng)可用于別的進(jìn)程的已緩存的文件字節(jié)碼在此時(shí)損壞,就會(huì)導(dǎo)致崩潰。 How Badoo saved one million dollars switching to PHP7 我們成功的把我們的應(yīng)用遷移到了php7上面(數(shù)百臺(tái)機(jī)...

    biaoxiaoduan 評(píng)論0 收藏0
  • PHP7 的抽象語(yǔ)法樹(shù)(AST)帶來(lái)的變化

    摘要:本文并不會(huì)告訴你抽象語(yǔ)法樹(shù)是什么,這需要你自己去了解,這里只是描述給帶來(lái)的一些變化。中在語(yǔ)法分析階段不再直接生成,而是先生成,所以過(guò)程多了一步詞法掃描分析,將源文件轉(zhuǎn)換成流語(yǔ)法分析,從流生成抽象語(yǔ)法樹(shù)從抽象語(yǔ)法樹(shù)生成。 本文大部分內(nèi)容參照 AST 的 RFC 文檔而成:https://wiki.php.net/rfc/abstract_syntax_tree,為了易于理解從源文檔中節(jié)選...

    Coding01 評(píng)論0 收藏0
  • 2017年P(guān)HP程序員未來(lái)路在何方

    摘要:目前來(lái)看等語(yǔ)言還難以企及和。作為一個(gè)資深的開(kāi)發(fā)者,在技術(shù)上給各位程序十點(diǎn)未來(lái)的建議,希望對(duì)大家有所幫助。開(kāi)發(fā)者應(yīng)當(dāng)學(xué)習(xí)掌握規(guī)范,在開(kāi)發(fā)程序時(shí)應(yīng)當(dāng)盡量遵循規(guī)范。程序員除了寫(xiě)后臺(tái)程序之外,還有很大一部分工作在展現(xiàn)層,和瀏覽器前端打交道。 PHP 從誕生到現(xiàn)在已經(jīng)有20多年歷史,從Web時(shí)代興起到移動(dòng)互聯(lián)網(wǎng)退潮,互聯(lián)網(wǎng)領(lǐng)域各種編程語(yǔ)言和技術(shù)層出不窮, Node.js 、 GO 、 Pytho...

    william 評(píng)論0 收藏0
  • PHP7源碼分析PHP7語(yǔ)言的執(zhí)行原理

    摘要:在中,源代碼首先將進(jìn)行詞法分析,將源代碼切割為多個(gè)字符串單元,分割后的字符串稱(chēng)之為。圖以為例解釋型語(yǔ)言的執(zhí)行示意圖第步源碼通過(guò)詞法分析得到第步基于語(yǔ)法分析器生成抽象語(yǔ)法樹(shù)第步抽象語(yǔ)法樹(shù)轉(zhuǎn)換為指令集合,解釋執(zhí)行。 順風(fēng)車(chē)運(yùn)營(yíng)研發(fā)團(tuán)隊(duì) 李志 發(fā)表在程序人生 公眾號(hào)我們常用的高級(jí)語(yǔ)言有很多種,比較出名的有CC++、Python、 PHP、Go、Pascal等。而這些語(yǔ)言根據(jù)運(yùn)行的方式不同,...

    VEIGHTZ 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<