PHP8PHP7CGolangLuaLuaJIT性能对比测试

PHP8PHP7CGolangLuaLuaJIT性能对比测试,第1张

    因为已经使用了超过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都采用此代码

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都采用这个代码
function test()
        local abc=0
        for i=1,500000000,1 do
                abc = abc+1
        end
        print(abc)
end

test()
测试采用多次测试,以下显示中间结果
# 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.23s
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
表格显示
PHPPHPPHP-JITLuaLuaJITGolangC-GCCC-GCC-O2
7.2.348.0.98.0.95.1.52.0.1-beta31.13.157.4.07.4.0
16.23s9.14s0.23s20.10s0.35s0.12s0.28s<=0.00s
测试结论

PHP评价,PHP8即便不开启JIT也比PHP7性能高很多,开启JIT后性能差距进一步拉大(PHP8的JIT来自LuaJIT项目中的DynASM项目),在开启JIT的情况下其执行性能已超过没有优化的C代码,与GO的差距不到2倍。同时PHP7大量内存泄漏的问题得到了改善,PHP8开始全面启用了安全内存分配,所以推荐使用者尽快升级使用PHP8。(特别说明,PHP解析器存放在了SquashFS中,不是EXT4可能因此PHP的执行速度更快)

Lua评价,Lua真的很慢很慢,经过LuaJIT后速度提升非凡呀,多亏了DynASM项目的贡献。只占用了几百K空间的情况下便实现了在内存中将Lua代码编译为汇编代码。但同样是DynASM结果PHP8优化的更好,看来Lua自身架构问题还要继续优化。

Golang评价,无需置疑的是在这次测试中Golang性能非常好,但同时这个语言的某些让人受不了的设计特性也让我们在接下来的项目开发中首先砍掉了:Golang感觉就像是C语言的gcc -static静态编译+一个函数库。什么东西都巨大无比,比如这个测试代码编译后达到了1.5MB的容量,这让我们无法在低端路由器上开发任何产品。

C评价,没办法评价整个Linux的内核还是底层系统API库全是由C语言开发的,这咋评价,且由于测试精度的问题当-O2优化以后已经<=0.00s了。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/995545.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存