php8.0 尝鲜以及开启 jit 流程,测试与 golang , java 性能差距

11月26日发布

下载地址:https://www.php.net/downloads

环境:本地 win10系统

性能测试:随机生成数组冒泡排序,10000条,结果2秒左右与php7.4相差无几。

开启jit 过程

根目录下创建php.ini文件

将php.ini-development 文件内容复制到里面

找到 [opcache] 下设置(填写你自己的ext\php_opcache.dll位置)

1
2
3
4
5
opcache.enable=1
zend_extension="C:\phpstudy_pro\Extensions\php\php8\ext\php_opcache.dll"

opcache.jit=1255
opcache.jit_buffer_size=100M

重启服务器打印:phpinfo() jit是on就是开启成功了

再次测试0.6秒左右,性能确实提高不少。

同样算法下

用golang同样的算法:用切片类型是 0.133秒, 数组类型0.097秒

用java同样算法:0.130左右

附上代码

php:

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
function microtime_float()
{
    list($usec, $sec) = explode(" ", microtime());
    return ((float)$usec + (float)$sec);
}

$time_start = microtime_float();
$n = 1e4;
$arr = [];
for($i=0;$i<$n;$i++) {
    $arr[] = rand(1,1e4);
}
foreach ($arr as $k=>$v) {
    for($i=$k+1;$i<$n;$i++) {
        if($arr[$k] < $arr[$i]) {
            $vvv = $arr[$k];
            $arr[$k] = $arr[$i];
            $arr[$i] = $vvv;
        }
    }
}

$time_end = microtime_float();
$time = $time_end - $time_start;
echo $time;

golang:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    t1 := time.Now()
    len := 10000
    //切片
    var arr = make([]int, len)
    //数组
    //var arr [10000]int  
    rand.Seed(time.Now().UnixNano())
    for i := 0;i<len;i++ {
        arr[i] = rand.Intn(1e6)
    }

    for val := range arr {
        for j := val+1;j<len;j++ {
            if arr[val] < arr[j] {
                arr[val],arr[j] = arr[j],arr[val]
            }
        }
    }

    t2 := time.Since(t1)
    fmt.Println(t2)

java:

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
    @ResponseBody
    @RequestMapping("/sort")
    public long sort() {
        long t1 = System.currentTimeMillis();
        int n = 10000;
        int[] arr = new int[n];
        Random r = new Random();
        for (int i = 0; i < n; i++) {
            int ran1 = r.nextInt(100000);
            arr[i] = ran1;
            //System.out.println(ran1);
        }

        for(int i = 0;i< n;i++) {
            for(int j=i+1;j<n;j++) {
                if(arr[i]<arr[j]) {
                    int vvv = arr[i];
                    arr[i] = arr[j];
                    arr[j] = vvv;
                }
            }
        }
        //System.out.println(System.currentTimeMillis()-t1);
        return System.currentTimeMillis()-t1;
    }