? ? 因为已经使用了超过7年的PHP 5已经不能满足现在系统需要了,即便是编译也因为OpenSSL版本太新无法兼容,即便是打了Patch勉强可以,也感觉是时候应该换个工具用来给应用团队开发产品了。这样一件事情,在我们这种开源的Team中其实尤为谨慎,因为我们对选择一个工具环境或平台架构每次都是使用超过5年以上的生命周期。这次就顺着选择来做了一轮测试。
? ? 我们采用的是HardCore硬核测试方法,这是被很多很多人鄙视的测试方法,因为大家觉得简单。我们恰恰觉得这种测试是非常非常好的。测试无非是测试代码到CPU、或代码到RAM的性能,比如Golang如果测试内存Copy性能非常好,比C语言都要强,这种测试只能是"Golang 官方"做的事情,为了显得这种语言牛逼而干的事。我们不能因为语言有差异就倾斜,所以最后选择HardCore针对不同的语言进行。如果读者还不信服,那么请问你买CPU是看CPU有什么指令集还是看CPU到底快不快?如果读者还不信服赶紧关浏览器吧,我们叫不醒一个装睡的人。
测试环境
- 硬件环境:VirtualBox虚拟机
- CPU类型:AMD 5800H (该CPU性能目前秒杀Intel同级别几万块钱的笔记本)
- 内存:512MB
- 操作系统:OpenWRT 19.07.8 X86_64版
在测试中所使用的PHP8使用了本人开发的FRICC2高性能PHP源码加密,并且采用了静态编译进入PHP环境中,该程序不会提升PHP解析器性能,主要实现的是对源码进行加密保护,采用静态编译后经过去符号处理,极难跟踪破解。
OpenWRT操作系统是一种通信产品用的操作系统,适用于路由器或各类网关,也支持x86架构,可以上网购买《跟hoowa学做智能路由》书学习这个操作系统。该系统因采用了优化版的编译器,同等硬件下其性能比目前流行发行版Linux更高。
测试程序
PHP
#不论PHP7 PHP8都采用此代码
<?php
$abc=0;
for ($i=0;$i<500000000;$i++) {
$abc++;
}
echo "=$abc=$i=\n";
?>
C
#include "stdint.h"
#include "stdio.h"
int main(void)
{
uint32_t abc,i;
abc=0;
for (i=0;i<500000000;i++) {
abc++;
}
printf("=%d=%d=\n",abc,i);
return 0;
}
Golang
package main
import "fmt"
func main() {
var sum, i uint32
for i = 0; i < 500000000; i++ {
sum++
}
fmt.Println("sum=,i=", sum, i)
}
Lua
-不论lua还是luajit都采用这个代码
abc=0
for var=1,500000000,1 do
abc = abc+1
end
print("=",abc,"=",var,"=")
测试采用多次测试,以下显示中间结果
# PHP 7.2.34
root@OpenWrt:~# time php-cli t.php
=500000000=500000000=
real 0m 16.23s
user 0m 16.22s
sys 0m 0.00s
# PHP 8.0.9 (no-JIT)
root@OpenWrt:~# time /appenv/bin/p8 t.php
=500000000=500000000=
real 0m 9.14s
user 0m 9.13s
sys 0m 0.00s
# PHP 8.0.9 (JIT)
root@OpenWrt:~# time /appenv/bin/p8 t.php
=500000000=500000000=
real 0m 0.47s
user 0m 0.47s
sys 0m 0.00s
# Lua 5.1.5
root@OpenWrt:~# time lua t.lua
= 500000000 = nil =
real 0m 20.10s
user 0m 20.08s
sys 0m 0.00s
# LuaJIT 2.1.0-beta3
root@OpenWrt:~# time luajit t.lua
= 500000000 = nil =
real 0m 0.35s
user 0m 0.35s
sys 0m 0.00s
# Golang 1.15.5
root@OpenWrt:~# time ./testgo
sum=,i= 500000000 500000000
real 0m 0.12s
user 0m 0.11s
sys 0m 0.00s
# GCC 7.4.0
root@OpenWrt:~# time ./t
=500000000=500000000=
real 0m 0.28s
user 0m 0.28s
sys 0m 0.00s
# GCC 7.4.0 O2
root@OpenWrt:~# time ./t
=500000000=500000000=
real 0m 0.00s
user 0m 0.00s
sys 0m 0.00s
表格显示
PHP | PHP | PHP-JIT | Lua | LuaJIT | Golang | C-GCC | C-GCC-O2 | 7.2.34 | 8.0.9 | 8.0.9 | 5.1.5 | 2.0.1-beta3 | | 7.4.0 | 7.4.0 | 16.23s | 9.14s | 0.47s | 20.10s | 0.35s | 0.12s | 0.28s | <=0.00s |
测试结论
PHP评价,PHP8即便不开启JIT也比PHP7性能高很多,开启JIT后性能差距进一步拉大(PHP8的JIT来自LuaJIT项目中的DynASM项目),通过与LuaJIT对比感觉未来PHP8-JIT还有改善空间进一步提升性能。同时PHP7大量内存泄漏的问题得到了改善,PHP8开始全面启用了安全内存分配,所以推荐使用者尽快升级使用PHP8。
Lua评价,Lua真的很慢很慢,经过LuaJIT后速度提升非凡呀,多亏了DynASM项目的贡献。只占用了几百K空间的情况下便实现了在内存中将Lua代码编译为汇编代码。
Golang评价,无需置疑的是在这次测试中Golang性能非常好,但同时这个语言的某些让人受不了的设计特性也让我们在接下来的项目开发中首先砍掉了:Golang感觉就像是C语言的gcc -static静态编译+一个函数库。什么东西都巨大无比,比如这个测试代码编译后达到了1.5MB的容量,这让我们无法在低端路由器上开发任何产品。
C评价,没办法评价整个Linux的内核还是底层系统API库全是由C语言开发的,这咋评价,且由于测试精度的问题当-O2优化以后已经<=0.00s了。
|