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