Go 和 PHP 性能如何進(jìn)行對(duì)比?你覺(jué)得哪個(gè)更好?
PHP性能很差嗎?
每次講到PHP和其他語(yǔ)言間的性能對(duì)比,似乎都會(huì)發(fā)現(xiàn)這樣一個(gè)聲音:?jiǎn)渭兊男阅軐?duì)比沒(méi)有意義,主要瓶頸首先是數(shù)據(jù)庫(kù),其次是業(yè)務(wù)代碼等等。
好像PHP的性能真的不能單獨(dú)拿出來(lái)討論似的。但其實(shí)一份關(guān)于Workerman的基本性能對(duì)比中發(fā)現(xiàn),Workerman比Go還要強(qiáng)。
該測(cè)試的原文在這里:https://www.workerman.net/a/1337 ,大家有興趣可以自己查看。改文章將GO、Workerman、Webman、Swoole、Swoole+協(xié)程進(jìn)行了測(cè)壓對(duì)比。
大體上的結(jié)果是:
- workeman壓測(cè)性能高于golang
- webman短連接高于golang
- webman的keepalive長(zhǎng)連接略低于golang
- swoole短連接高于golang
- swoole的keepalive低于golang
- workerman和webman不管是短連接還是keepliave都高于swoole。
總體而言,Workerman和Webman比較強(qiáng)。這是一個(gè)基本的hello word的IO測(cè)試。雖然我們都認(rèn)為這并沒(méi)有什么用,但是這還是很有意思的一個(gè)現(xiàn)象。
為什么現(xiàn)在的PHP框架都在宣稱高性能?
你會(huì)發(fā)現(xiàn),現(xiàn)在PHP的各個(gè)熱點(diǎn)文章都把高性能掛在嘴邊,這是為什么呢?PHP的性能很差,這似乎是共識(shí),即便是PHP的開(kāi)發(fā)者也從來(lái)不去深究這個(gè)問(wèn)題,但現(xiàn)在為什么大家都在說(shuō)PHP的性能很高呢?
現(xiàn)在的PHP框架都在宣稱高性能,主要是因?yàn)殡S著互聯(lián)網(wǎng)應(yīng)用的不斷發(fā)展,對(duì)于響應(yīng)速度和性能的要求也越來(lái)越高,而傳統(tǒng)的PHP開(kāi)發(fā)方式在并發(fā)處理和性能方面存在一定的瓶頸,因此出現(xiàn)了一些新的PHP框架,例如Swoole、Laravel、Yii以及ThinkPHP等,都在性能方面進(jìn)行了大量?jī)?yōu)化,以滿足用戶對(duì)于高性能的要求,并且在處理高并發(fā)時(shí)有更好的表現(xiàn)。此外,現(xiàn)代框架的出現(xiàn)也推動(dòng)了PHP語(yǔ)言本身的發(fā)展,PHP在性能方面也做出了一些改善。
總結(jié)的說(shuō):
- PHP本身在進(jìn)步,不要再用PHP5的時(shí)代看現(xiàn)在的PHP
- PHP生態(tài)在變化,新的框架的誕生都在性能方面做優(yōu)化
- PHP的運(yùn)行方式也發(fā)生了變化,從PHP-FPM到現(xiàn)在的基于epoll的驅(qū)動(dòng)
性能對(duì)比有意義嗎?
單純的對(duì)比GO和PHP,其實(shí)有很多有趣的值得注意的地方。
JSON處理
首先GO的json解析并不如PHP的更快更好,PHP的json解析是用C實(shí)現(xiàn)的,也意味著即便是在PHP-FPM環(huán)境下,單純的json處理也很快。而且更別提開(kāi)發(fā)上了,PHP不用預(yù)定義結(jié)構(gòu),一行代碼直接將json從字符串變成了數(shù)組(或?qū)ο螅?,這一點(diǎn)真的很清爽。
協(xié)程
PHP也有協(xié)程,由關(guān)鍵字yield實(shí)現(xiàn),但使用起來(lái)很隱晦,Swoole借用了GO語(yǔ)法中的go關(guān)鍵字,使在使用PHP是也能很氣輕松地實(shí)現(xiàn)協(xié)程用法。
異步
PHP是一個(gè)同步語(yǔ)言,即便是有協(xié)程,但大多數(shù)的代碼操作都是同步的,比如file_get_content,無(wú)論你再怎么牛逼,它也是同步的。
其實(shí)PHP在異步上,也有很多的進(jìn)本,像Workerman、Swoole、ReactPHP等等框架,都推出了自己環(huán)境下的異步HTTP客戶端庫(kù)。但這可能是不夠的。不過(guò)有一個(gè)很有意思的項(xiàng)目,是ReactPHP框架下的,叫:chemem/asyncify,他能讓任何的PHP代碼都以異步的方式運(yùn)行。使用起來(lái)也很簡(jiǎn)單:
use function Chemem\Asyncify\call;
$call = call('file_get_contents', ['foo.txt'])
->then(
function (?string $contents) {
echo $contents;
},
function (\Throwable $err) {
echo $err->getMessage();
}
);
總之
開(kāi)發(fā)者之間很喜歡做性能對(duì)比,而PHP開(kāi)發(fā)者對(duì)這方面有更多的情節(jié)??赡苁荘HP的生態(tài)太龐大了,即便是PHP開(kāi)發(fā)者之間,面對(duì)不同框架,也會(huì)有不同的態(tài)度。我見(jiàn)過(guò)一個(gè)網(wǎng)友,一直在吹Swoole,一句其他的意見(jiàn)也聽(tīng)不進(jìn)去,也是很有趣的現(xiàn)象。
但有一種論調(diào),叫XXX割裂了PHP,這種說(shuō)法是不對(duì)的。PHP從來(lái)不像JAVA和GO那樣,在某個(gè)時(shí)代都認(rèn)同某個(gè)技術(shù),比如java的spring。PHP一直很活躍,這是好事。PHP可能從來(lái)沒(méi)有時(shí)尚過(guò),沒(méi)有引領(lǐng)過(guò)什么,但他也從來(lái)不落后于時(shí)代。
但PHP的從業(yè)者確實(shí)不夠技術(shù)范兒,落后太多了。這一點(diǎn)無(wú)論國(guó)內(nèi)外都一樣,如果在國(guó)外發(fā)表一篇性能對(duì)比的文章,其中使用的PHP版本是PHP7.1,無(wú)論結(jié)果如何,人們也會(huì)在評(píng)論區(qū)高呼:“太棒了,最起碼他沒(méi)有用PHP5.6”。
性能對(duì)比也是有操作空間的,比如我們發(fā)起一個(gè)比賽:哪個(gè)語(yǔ)言處理JSON最快?對(duì)于這個(gè)問(wèn)題,PHP可能不是最快的,但也不會(huì)有什么擔(dān)心的。