Post view

「物件導向程式」與「非物件導向程式」的PHP 5.5、PHP 7執行速度效能大測試!

停留在Windows 7還是決定升級到Windows 10?

在電腦上,追求「最新的版本」的意思通常表示:功能最新、功能最多、安全性最好、問題最少。但是「最新的版本」有時候會有「向下相容」的問題,也就是可能會與其他舊版軟體、舊的硬體有相容性的問題,

當然,「最新的版本」有時候也會因為增加了更多功能,因為「功能更多」而導致比舊版還要慢的情況。在這篇文章裡面,甚至還有「phpBB的站長」現在才想要從10多年前的PHP 4的phpBB 2,找人(或是請人)自己想辦法從PHP 4一口氣升級到PHP 7!幾乎無法升級,是絕對必然的下場。

insoler網站重新安裝大改版!升級到macOS 10.13.6、PHP 7.1.23、Dolphin 7.4

我想就算是現在,還是有人寧可繼續使用Windows XP、Windows 7,而不願意升級到Windows 10的最新版本,理由通常是因為考量到「向下相容性」的問題。

對我來說,除非有「無法升級」的理由,我通常都會選擇升級到目前「最新的版本」!如果因為版本升級、功能更多而導致電腦跑的更慢,那就意味著我必須考慮買新的電腦來替換老舊的電腦主機。

不過,我不會隨便參考網路上的很多「跑分App」或是「跑分網站」或是依據Geekbench 4測試的分數來輕易選擇電腦!因為一台電腦的「測試分數」通常會受到許多因素的影響。而電腦的「測試分數」就算非常好看,分數很高,也不表示執行PHP的速度就很快,更不表示在那台全新電腦上安裝一套完全相同的PHP 7.3來跑phpBB、WordPress、Joomla、Dolphin的網頁開啟速度就會變的更快!

事實上,我最近在一台2018年最新的「Acer筆記型電腦」與一台10年前老舊的Mac mini (Late 2009) Intel Core 2 Duo雙核心、8GB DDR3電腦上,比較兩台電腦執行相同的PHP程式,到底是誰比較快?答案是10年前老舊的Mac mini擊敗2018年最新的「Acer筆記型電腦」,甚至還將近2倍快!

是什麼樣的2018年的電腦,竟然會輸給2009年的Mac mini老舊電腦呢?答案是這台筆電:

  • Acer Nitro 5 Marvel’s Avengers: Infinity War Thanos Edition
  • 搭載Intel® Core™ i5-7300HQ 處理器 4核心 2.50 GHz
  • NVIDIA® GeForce® GTX 1050 連 4 GB 專用 記憶體
  • 39.6 cm (15.6") Full HD (1920 x 1080) 16:9 IPS
  • 16 GB, DDR4 SDRAM
  • 1 TB HDD, 128 GB SSD
  • Windows 10 家用版

一台2009年老舊的Mac mini電腦,只有「雙核心 2.53GHz」,執行完全相同的PHP程式碼,竟然還會比2018年的「4核心 2.50 GHz」更快一倍左右,我當然就沒有理由扔掉這台仍舊老當益壯的Mac mini電腦!畢竟這台Mac mini用來擔任BNW網站主機,還非常的好用。

雖然如此,我還是要進行更多的測試,以及更實際網站速度測試,才能知道到底需不需要「買新的Mac mini來替換老舊的Mac mini主機」?

任何的「跑分App」或是「Benchmark」效能測試軟體,都與「硬體」息息相關,因此我必須事先說明我使用的4台Mac mini的測試主機。

Mac mini (Late 2009) Intel Core 2 Duo 2.53GHz 雙核心(雙執行緒)

這是擔任BNW網站的主機。使用的作業系統是這台老舊主機可以安裝的最後的版本OS X El Capitan 10.11.6。比較新的macOS 10.12已經無法安裝在這台老舊電腦上。使用的PHP版本是OS X系統內建的PHP 5.5.38。

Mac mini (Late 2012) Intel Core i7 2.6GHz 四核心(8執行緒)

另外3台Mac mini的製造時間、規格、配備都完全相同。這3台電腦分別擔任insoler社群網站的Web Server與MySQL Server主機。由於海豚Dolphin 7.3.5並不支援PHP 7的關係,所以在幾年內的很長一段時間,insoler網站伺服器主機一直都是使用OS X El Capitan 10.11.6與PHP 5.5.38。

由於BOONEX在11th of February 2019今年二月的時候,才終於大改版升級到Dolphin 7.4。這個版本才能在PHP 7以上的版本執行,但也可以在PHP 5.5上面執行。因此底下的畫面是insoler這幾天才剛剛升級到macOS High Sierra 10.13.6的畫面。

雖然目前最新的作業系統版本是macOS Mojave 10.14.3,但是這個版本的macOS Server已經不再支援Web Server,只剩下NAS網路磁碟機功能,因此就算買最新的Mac mini,我還是只能安裝比較老舊的macOS High Sierra 10.13.6。除非我找到什麼新的方法,可以在macOS Mojave 10.14.3上面安裝整套Web Server與PHP 7.3與HTTPS加密認證。

這是另外一台規格相同的Mac mini (Late 2012) 的電腦主機,由於MySQL Server電腦上不需要安裝Web Server,所以這台電腦就可以直接安裝目前最新的macOS Mojave 10.14.3。

PHP 5.5還是PHP 7.1、PHP 7.3?

雖然「理論上」最新的電腦絕對都會比老舊電腦更快!但也有例外!在Intel Core i5-7300HQ 處理器 4核心 2.50 GHz的電腦上跑相同的PHP測試程式,竟然比Intel Core 2 Duo 2.53GHz的Mac mini還要慢!因此我決定寫兩個PHP測試程式來測試一下,在不同的電腦上,執行完全相同的PHP測試程式的效能到底是如何?執行相同的測試程式,需要花多少時間?

PHP團隊之所以放棄發展很久的PHP 6,主要的問題不是無法新增功能!要在任何一個程式上增加更多功能,絕對不是問題!問題是增加更多功能,只會「越跑越慢」而已!而PHP 6的目標之一就是希望「跑的比PHP 5更快」!很不幸的,原本的PHP團隊辦不到!於是只好放棄整個PHP 6。

PHP 7與PHP 5最大的差異就是PHP 7是「速度導向」完全是「追求速度」!也因此必須犧牲「向下相容」的優勢,而且移除了許多老舊的函式來提升執行速度,因此反而是一個「減少功能」「不向下相容」的一個「追求速度新版本」。

由於「不向下相容」的關係,導致所有的PHP 5程式碼都必須大幅度的重新改寫!而沒有一個簡單的「轉換程式」或是「升級程式」只要按幾個「下一步」按鈕,就可以輕鬆的升級!

在過去的PHP 3、PHP 4、PHP 5(PHP 6未發表),最大的特色就是「物件導向程式」絕對比「非物件導向程式」還要更慢很多!這也是必然的結果!因為「物件導向程式」使用了更多的class等指令,需要執行的指令更多,當然就意味著PHP執行速度就絕對會更慢!

也因此我寫了兩個非常類似的PHP測試程式,一個是使用「物件導向程式」,另外一個則是「故意不使用物件導向」的「非物件導向程式」的測試程式。現在就趕快來看一下相同的PHP測試程式,在不同的電腦、不同的PHP版本上的測試結果。要提醒你的是,這些PHP測試程式都是重複執行過許多次,雖然不是追求最短時間,但基本上是大致相同的執行結果。小數點1位以下可以忽略。

Mac mini (Late 2009)、PHP 5.5.38、使用OPcache快取

你可以看到...PHP 物件導向程式執行時間:9.79秒。

將近10秒,確實是有點慢,甚至是「太慢了」!不過就算如此,應該還是比2018年的Core i5 四核心的筆電快很多!

Mac mini (Late 2009)、PHP 5.5.38、使用OPcache快取

非物件導向程式,普通 PHP 副程式的執行時間:7.02秒。

這證明我前面的說明,確實「非物件導向」的PHP程式還是比需要寫更多class指令的「物件導向」程式跑的還要更快很多!而且差距高達2秒!

Mac mini (Late 2012)、PHP 5.5.38、使用OPcache快取

PHP 物件導向程式執行時間:5.87秒。

很明顯的,Core i7 2.6Ghz四核心的執行速度幾乎是Core 2 Duo 2.53GHz的2倍。前面的執行速度是9.79秒。將近10秒。

Mac mini (Late 2012)、PHP 5.5.38、使用OPcache快取

非物件導向程式,普通 PHP 副程式的執行時間:4.25秒。

這個速度也比前面的7.02秒。更快了許多,雖然還不到2倍快,但也快了將近1.8倍!更重要的是,這個速度也比「物件導向程式」的5.87秒,還要快了許多!

從以上的測試結果可以證明,在PHP 5.5(包括最後的版本PHP 5.6)的環境下,PHP的「物件導向程式」絕對比「非物件導向程式」還要更慢!而2009年的Core 2 Duo 2.53GHz雙核心Mac mini主機也確實比2012年的Core i7 2.6GHz四核心Mac mini主機更慢一倍左右。

由於PHP是「直譯電腦程式語言」而不是「編譯電腦程式語言」,如果是C++、C#、Objective-C、Swift等「編譯電腦程式語言」的話,就不會有「非物件導向程式」跑的比「物件導向程式」還要快很多的差異!畢竟經過Compiler編譯程式轉成 .exe(Windows的執行檔)或是App執行程式碼以後,就不會有「物件導向」這件事!因為Intel處理器本身的「CPU指令」並不理會「物件導向」,也沒有「物件導向CPU指令」。

既然2012年的Mac mini比2009年的Mac mini快一倍,就可以推測、猜想2018年的全新大改款Mac mini應該會比2012年的Mac mini更快一倍以上。不過這只是推想,沒有經過實際的測試,我不確定執行相同的PHP程式碼會快多少?

Mac mini (Late 2012)、PHP 7.3、不使用OPcache快取

PHP 7最大的進步就是「追求執行速度」!可以在相同的電腦主機上,縮短許多的執行時間,讓網頁的顯示速度變的更快,同樣一台電腦可以同時服務更多user。所以可以想像PHP 7.3應該會比PHP 7.2更快。而PHP 7.2又比PHP 7.1更快。實際的測試結果也是如此!你可以看到在完全相同的Mac mini 2012年的電腦上,使用舊的PHP 5.5.38執行「PHP 物件導向程式」需要「5.87秒」。

PHP 物件導向程式執行時間:2.60秒。

不升級任何電腦設備,在完全相同的電腦上,只是升級PHP版本到PHP 7.3,就可以從「5.87秒」進步到「2.60秒」竟然快了2.2倍!clap

Mac mini (Late 2012)、PHP 7.3、不使用OPcache快取

非物件導向程式,普通 PHP 副程式的執行時間:2.39秒。

很明顯,即使到了PHP 7.3,仍舊很難解決「物件導向」比「非物件導向」還要更慢的缺點!

Mac mini (Late 2012)、PHP 7.3、使用OPcache快取

「物件導向」比「非物件導向」程式碼的執行速度還要更慢的問題,只能藉由PHP內建的OPcache快取來解決。在PHP 5.6以前的OPcache是屬於需要另外安裝的快取程式模組。但是我認為PHP 7.3以後的版本,應該把許多模組都改成「內建標準模組」才對!除了OPcache快取以外,幾乎所有MIS網管人員都需要使用的SSH要改成「內建標準模組」,以及應該要廢除不切實際的GD圖形處理模組,直接改成「PHP Imagick」。

PHP 物件導向程式執行時間:1.84秒。

Mac mini (Late 2012)、PHP 7.3、使用OPcache快取

非物件導向程式,普通 PHP 副程式的執行時間:1.92秒。

是的,你沒有看錯!我也經過多次的測試,證明我沒有「眼花」!在開啟OPcache快取以後,竟然首次看到「物件導向程式」跑的比「非物件導向程式」還要更快!雖然沒有快很多,但幾乎沒有太大的差異!

這表示OPcache快取模組(需要正確的設定,只有使用OPcache預設值的話,無法達到最佳化)不只是「快取」而已,還有「協助加速PHP物件導向執行」的效果!

忽略2009年的Mac mini,在完全相同的「Mac mini (Late 2012)」電腦上,只是從PHP 5.5.38升級到PHP 7.3,在都有使用OPcache快取(當然PHP 5.5.38只能搭配舊版OPcache才能使用)的情況下,竟然跑出這樣的成績:

PHP 5.5.38 物件導向程式執行時間:5.87秒。

PHP 7.3 物件導向程式執行時間:1.84秒。

5.87秒 / 1.84秒 = 3.19倍!

不需要花錢更換全新的Mac mini電腦,就可以讓完全相同的PHP程式碼,在有點老舊的Mac mini 2012年的主機上,執行速度更快3倍左右,這是多麽美好的事情!clap

SSH2外掛模組不相容PHP 7.3

我在一開始就有提到關於「向下相容」的問題。雖然拋棄「向下相容」而採用大幅度修正、大進化的改版方式,也並不是一種錯,畢竟無論是誰都想要「進步」而不是不斷「向下相容」停在過去。

但是PHP不斷改版,就會導致許多「非官方」的外掛模組完全跟不上腳步!因為許多「非官方」幾乎全部都是由「個人」或是「幾個人」的非營利小團體寫成的模組,寫出來的模組也無法用來營利賺錢,當然就會有一大堆外掛模組與PHP 7.3不相容的問題!

例如在著名的github網站上就有人說SSH2還沒有支援PHP 7.3!事實上,我認為PHP 7.3應該要內建SSH2模組才對!SSH畢竟是Linux系統最多人使用,甚至天天使用的功能!

SSH2 extension does not yet support PHP 7.3

在這個列表裡面,列在「正在處理中」的模組,也多達21個!其中就包含SSH 1.1.2。

PHP extensions status with upcoming PHP 7.3

2. Work in progress

These extensions have been fixed upstream (or PR are available) but no official release.

# Name Version State
  cassandra 1.3.2 Fixed by PR #126 awaiting review.
  geos 1.0.0 Fixed by PR #20 awaiting review.
  hprose 1.6.6 Fixed by PR #14 merged.
  mailparse 3.0.2 Fixed upstream
  memcache 3.0.9-dev Fixed upstream, despite this extension in unmaintained
  mogilefs 0.9.3.1 Fixed by PR #25 merged.
  mysql_xdevapi 8.0.11 Fixed by PR #5 awaiting review.
  oauth 2.0.2 Fixed upstream
  opencensus 0.2.2 Fixed by PR #165 but won't be merged as I can't sign the fucking google CLA.
  pinba 1.1.1 Fixed upstream
  rar 4.0.0 Fixed by PR #4 awaiting review.
  request 1.0.0b2 Fixed by PR #12 merged and awaiting review.
  solr v2 2.4.0 Fixed upstream
  ssh2 1.1.2 Fixed upstream
  uploadprogress 1.0.3.1 PHP 7+ compatibility fixed upstream, but probably dead.
  uv 0.2.2 Fixed upstream and by PR #60 merged.
  v8js 2.1.0 Fixed upstream
  yac 2.0.2 Fixed by PR #89 awaiting review.
  yaconf 1.0.8-dev Fixed upstream
  yaz 1.2.2 Fixed by PR #7 merged.

 

zmq 1.1.3 Fixed by PR #195 awaiting review.

 

雖然SSH2 1.1.2這個版本最多只能用在PHP 7.2。但是我認為應該頂多只能搭配PHP 7.1而且在某些作業系統環境下,可能還會遇到問題!因為SSH2 1.1.2目前仍舊是alpha測試版!連beta測試版都不算!更不用奢望能在今年正式推出支援PHP 7.3的stable穩定版!

PECL :: Package :: ssh2

Available Releases
Version State Release Date Downloads  
1.1.2 alpha 2017-07-23 ssh2-1.1.2.tgz (31.3kB)  DLL [ Changelog ]
1.1.1 alpha 2017-06-25 ssh2-1.1.1.tgz (26.9kB)  DLL [ Changelog ]
1.1 alpha 2017-06-14 ssh2-1.1.tgz (26.8kB)  DLL [ Changelog ]
1.0 alpha 2016-06-12 ssh2-1.0.tgz (28.3kB)  DLL [ Changelog ]
0.13 stable 2016-06-12 ssh2-0.13.tgz (28.3kB) [ Changelog ]

 

雖然最新版本的PHP 7.3的執行速度非常快,甚至可以讓物件導向程式(現代幾千個,甚至幾萬個網站系統,沒有一個不是「非物件導向程式」)跑的與非物件導向程式一樣快,甚至還可以更快一些!

但因為我需要使用SSH的關係,只好捨棄目前最新的PHP 7.3,只用macOS 10.13.6內建的PHP 7.1.23。

Mac mini (Late 2012)、PHP 7.1.23、使用OPcache快取

PHP 物件導向程式執行時間:3.1781070232391 秒。

Mac mini (Late 2012)、PHP 7.1.23、使用OPcache快取

非物件導向程式,普通 PHP 副程式的執行時間:3.1848938465118 秒。

你可以看到,在macOS High Sierra 10.13.6內建的PHP 7.1.23,就算已經開啟PHP內建的OPcache快取(意思是從此不需要再另外「手動」加裝這個外掛模組),的執行速度差距有點大:

PHP 物件導向程式執行時間:1.84秒 → 3.17秒。

非物件導向程式,普通 PHP 副程式的執行時間:1.92秒 → 3.18秒。

可說是慢了「1秒多」!如果是只有0.1秒的差異,或許「user」感受不到差異。但是慢了「1秒」我想不管是誰,都會感受到似乎略慢!由於SSH2不支援PHP 7.3,而且目前還是2017年,2年前的測試版,只能繼續等1-2年,甚至是2-3年,看看會不會有正式版!是的,「非營利」的「開放原始碼」陣營的進步速度就是這麼慢!

雖然如此,但是在相同的Mac mini (2012) 的電腦上,只是從PHP 5.5.38升級到PHP 7.1.23,也可以有這樣的加速效果:

PHP 物件導向程式執行時間:5.87秒 → 3.17秒。

非物件導向程式,普通 PHP 副程式的執行時間:4.25秒 → 3.18秒。

由於現代的網站程式,早就沒有「非物件導向程式」,因此可以忽視這部分的測試時間。主要是可以從「5.87秒 → 3.17秒」大約加速1.8倍,也算是不錯的成績。

由於在網頁上執行PHP測試程式,還必須經過Apache的Web Server處理,因此如果在「終端機」模式底下,直接執行PHP指令的話,速度當然會比較快一些。

PHP 物件導向程式執行時間:2.3229730129242 秒

非物件導向程式,普通 PHP 副程式的執行時間:2.4239389896393 秒

MacBook Pro (Retina, 15-inch, Late 2013)

那麼,如果在一台MacBook Pro電腦上進行完全相同的測試的話?

  • MacBook Pro (Retina, 15-inch, Late 2013)
  • 2.3 GHz Intel Core i7
  • 16 GB 1600 MHz DDR3

執行相同的PHP測試程式,使用macOS Mojave 10.14.3相同的內建PHP 7.1.23版本,同樣在開啟OPcache快取的情況下,執行結果是:

PHP 物件導向程式執行時間:2.0627410411835 秒

非物件導向程式,普通 PHP 副程式的執行時間:2.1200559139252 秒

你可以看到PHP的測試成績比前面Mac mini (2012) 的「2.32秒」的測試成績更好!已經非常接近網頁版的PHP 7.3的執行速度!

蘇言霖 2019/03/13 0 601
Comments
Order by: 
Per page:
 
  • There are no comments yet
Rate
0 votes
Post info
蘇言霖
「超級懶貓級」社群網站站長
2019/03/13 (566 days ago)
Actions