一年多前有個 C++ vs. Python vs. Perl vs. PHP performance benchmark 測試,當時 PHP 5.3.5 實在是被打的慘不忍睹。
測試程式的內容是找出 10000000 (一千萬) 以內的質數,然後重複執行十次。以不同語言實作,再執行各個比較時間。
我最近在自己的 Mac 上面編譯了 PHP 5.4 ,再跑一次這個測試,結果有比較滿意了 (但比起其他語言,還是輸!)
先跑 C++ (4.2.1) 試試看,結果很滿意,整個運算不到四秒就完成了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
roga@carlisten-lx:~/prime$ g++ -v Using built-in specs. Target: i686-apple-darwin11 Thread model: posix gcc version 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00) roga@carlisten-lx:~/prime$ g++ prime.c roga@carlisten-lx:~/prime$ mv a.out prime roga@carlisten-lx:~/prime$ time ./prime Found 664579 prime numbers. Found 664579 prime numbers. Found 664579 prime numbers. Found 664579 prime numbers. Found 664579 prime numbers. Found 664579 prime numbers. Found 664579 prime numbers. Found 664579 prime numbers. Found 664579 prime numbers. Found 664579 prime numbers. real 0m3.352s user 0m3.248s sys 0m0.099s |
接著再跑 Java (OpenJDK 1.7.0-u4-b228) 試試看,雖然比 C++ 慢,但也很快了!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
roga@carlisten-lx:~/prime$ java -showversion openjdk version "1.7.0-u4-b228" OpenJDK Runtime Environment (build 1.7.0-u4-b228-20120203) OpenJDK 64-Bit Server VM (build 23.0-b12, mixed mode) roga@carlisten-lx:~/prime$ javac prime.java roga@carlisten-lx:~/prime$ time java PrimeNumbersBenchmarkApp Found 664579 prime numbers. Found 664579 prime numbers. Found 664579 prime numbers. Found 664579 prime numbers. Found 664579 prime numbers. Found 664579 prime numbers. Found 664579 prime numbers. Found 664579 prime numbers. Found 664579 prime numbers. Found 664579 prime numbers. real 0m4.726s user 0m13.333s sys 0m0.488s |
再跑 python (2.7.1) 試試看
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
roga@carlisten-lx:~/prime$ python -V Python 2.7.1 roga@carlisten-lx:~/prime$ time python prime.py Found 664579 prime numbers. Found 664579 prime numbers. Found 664579 prime numbers. Found 664579 prime numbers. Found 664579 prime numbers. Found 664579 prime numbers. Found 664579 prime numbers. Found 664579 prime numbers. Found 664579 prime numbers. Found 664579 prime numbers. real 0m28.523s user 0m28.292s sys 0m0.227s |
然後是 Perl (5.12.3) ,跑出來比 Python 慢一些。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
roga@carlisten-lx:~/prime$ perl -v This is perl 5, version 12, subversion 3 (v5.12.3) built for darwin-thread-multi-2level (with 2 registered patches, see perl -V for more detail) roga@carlisten-lx:~/prime$ time perl prime.pl Found 664579 prime numbers. Found 664579 prime numbers. Found 664579 prime numbers. Found 664579 prime numbers. Found 664579 prime numbers. Found 664579 prime numbers. Found 664579 prime numbers. Found 664579 prime numbers. Found 664579 prime numbers. Found 664579 prime numbers. real 0m33.658s user 0m33.519s sys 0m0.135s |
最後是 php (5.3.6) ,大幅落後其他語言
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
roga@carlisten-lx:~/prime$ php -v PHP 5.3.6 (cli) (built: Sep 15 2011 11:22:25) Copyright (c) 1997-2011 The PHP Group Zend Engine v2.3.0, Copyright (c) 1998-2011 Zend Technologies roga@carlisten-lx:~/prime$ time php prime.php Found 664579 prime numbers. Found 664579 prime numbers. Found 664579 prime numbers. Found 664579 prime numbers. Found 664579 prime numbers. Found 664579 prime numbers. Found 664579 prime numbers. Found 664579 prime numbers. Found 664579 prime numbers. Found 664579 prime numbers. real 1m19.263s user 1m18.201s sys 0m1.059s |
最後是 PHP (5.4) ,速度有進步了,進入了一分鐘俱樂部,但還是不優。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
roga@carlisten-lx:~/prime$ /usr/bin/php -v PHP 5.4.0 (cli) (built: Mar 20 2012 11:27:54) Copyright (c) 1997-2012 The PHP Group Zend Engine v2.4.0, Copyright (c) 1998-2012 Zend Technologies roga@carlisten-lx:~/prime$ time /usr/bin/php prime.php Found 664579 prime numbers. Found 664579 prime numbers. Found 664579 prime numbers. Found 664579 prime numbers. Found 664579 prime numbers. Found 664579 prime numbers. Found 664579 prime numbers. Found 664579 prime numbers. Found 664579 prime numbers. Found 664579 prime numbers. real 0m53.264s user 0m52.239s sys 0m1.019s |
另外 PHP 5.4.0 和 PHP 5.3.6 跑這隻程式,兩邊記憶體用量平均都在 800 MB 左右 (以 memory_get_usage(true) 來看),實在有點驚人。
ah….斷行都bye了..
謝謝你的數據 😀
學長, 如果你用php7你會更開心的!!PHP7只花了不到10秒鐘result on Vultr instance (45GB SSD/2v Core CPU/2GB RAM)root@debian:~/benchmark# ./run.sh== C++ (optimized with -O2) ==real 0m1.101suser 0m0.964ssys 0m0.136sreal 0m1.093suser 0m0.988ssys 0m0.104sg++ (Debian 4.9.2-10) 4.9.2== C++ (not optimized) ==real 0m2.686suser 0m2.548ssys 0m0.132sreal 0m2.525suser 0m2.412ssys 0m0.112sg++ (Debian 4.9.2-10) 4.9.2== Python 2.7 ==real 0m31.038suser 0m30.884ssys 0m0.140sreal 0m31.047suser 0m30.812ssys 0m0.140sPython 2.7.9== Perl ==real 0m29.635suser 0m29.484ssys 0m0.072sreal 0m28.608suser 0m28.512ssys 0m0.080sThis is perl 5, version 20, subversion 2 (v5.20.2) built for x86_64-linux-gnu-thread-multi== PHP ==real 0m7.876suser 0m7.736ssys 0m0.132sreal 0m8.697suser 0m8.500ssys 0m0.160sPHP 7.0.5 (cli) (built: May 3 2016 15:52:15) ( NTS )== JavaScript (nodejs) ==real 0m2.417suser 0m1.896ssys 0m0.516sreal 0m2.145suser 0m1.724ssys 0m0.416sv4.4.4
請教為何一直出現以下錯誤訊息?
== PHP ==
real 0m0.385s
user 0m0.243s
sys 0m0.141s
Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 71 bytes) in /www/CodeIgniter/i56/maintain/langs-performance/primes-php.txt on line 8
Unexpected loops count: 2
不管 php.ini 設定為 memory_limit = 128M 或 256M 都不行 >”<
那就再把記憶體開大一點,.. XD
你錯誤訊息的 268435456 bytes = 256MB
C++ 好威啊 0.0
不知道有沒有佔記體的分佈