V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zjsxwc
V2EX  ›  程序员

php7 怎么比 Java 还快?

  •  2
     
  •   zjsxwc ·
    zjsxwc · 2019-09-23 11:22:47 +08:00 · 16484 次点击
    这是一个创建于 1669 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有点反认知,分别用 PHP 与 Java Spring Boot 写了个返回 1 个像素点图片的接口,结果 php 比 java 快。

    代码

    PHP 代码

    <?php
    //xpng.php
    
    header("Content-type: image/png");
    
    echo base64_decode("iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWP4////fwAJ+wP9CNHoHgAAAABJRU5ErkJggg==");
    

    Java 代码

    //XController.java
    
    package com.abtest;
    
    import java.util.Base64;
    import org.springframework.http.HttpHeaders;
    import org.springframework.http.HttpStatus;
    import org.springframework.http.ResponseEntity;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class XController {
        @RequestMapping("/x.png")
        public ResponseEntity<byte[]> xpng() {
            String onepointpngBase64 = "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWP4////fwAJ+wP9CNHoHgAAAABJRU5ErkJggg==";
            HttpHeaders responseHeaders = new HttpHeaders();
            responseHeaders.set("Content-type", "image/png");
            byte[] decodedValue = Base64.getDecoder().decode(onepointpngBase64);
            return new ResponseEntity<byte[]>(decodedValue, responseHeaders, HttpStatus.OK);
        }
    }
    

    开始测试

    Server 分别 SpringBoot Jar 包自带的 Apache Tomcat/9.0.24

    PHP 就是 PHP 7.0.33-0+deb9u1 (cli) 自带的低性能调试用 server (使用php -S localhost:7767 -t .运行)

    AB 结果反直觉,PHP 居然比 Java 快

    PHP 结果耗时 0.125 秒
    $ ab -n 1000 -c 1000 "http://localhost:7767/xpng.php"
    This is ApacheBench, Version 2.3 <$Revision: 1757674 $>
    Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
    Licensed to The Apache Software Foundation, http://www.apache.org/
    
    Benchmarking localhost (be patient)
    Completed 100 requests
    Completed 200 requests
    Completed 300 requests
    Completed 400 requests
    Completed 500 requests
    Completed 600 requests
    Completed 700 requests
    Completed 800 requests
    Completed 900 requests
    Completed 1000 requests
    Finished 1000 requests
    
    
    Server Software:       
    Server Hostname:        localhost
    Server Port:            7767
    
    Document Path:          /xpng.php
    Document Length:        70 bytes
    
    Concurrency Level:      1000
    Time taken for tests:   0.125 seconds
    Complete requests:      1000
    Failed requests:        0
    Total transferred:      190000 bytes
    HTML transferred:       70000 bytes
    Requests per second:    8011.99 [#/sec] (mean)
    Time per request:       124.813 [ms] (mean)
    Time per request:       0.125 [ms] (mean, across all concurrent requests)
    Transfer rate:          1486.60 [Kbytes/sec] received
    
    Connection Times (ms)
                  min  mean[+/-sd] median   max
    Connect:        0    6   5.5      8      14
    Processing:     5   22  20.1     13      69
    Waiting:        4   22  20.2     12      69
    Total:          8   29  21.3     19      71
    
    Percentage of the requests served within a certain time (ms)
      50%     19
      66%     24
      75%     37
      80%     62
      90%     68
      95%     70
      98%     70
      99%     70
     100%     71 (longest request)
    
    Java 结果耗时 0.498 秒
    $ ab -n 1000 -c 1000 "http://localhost:8080/x.png"
    This is ApacheBench, Version 2.3 <$Revision: 1757674 $>
    Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
    Licensed to The Apache Software Foundation, http://www.apache.org/
    
    Benchmarking localhost (be patient)
    Completed 100 requests
    Completed 200 requests
    Completed 300 requests
    Completed 400 requests
    Completed 500 requests
    Completed 600 requests
    Completed 700 requests
    Completed 800 requests
    Completed 900 requests
    Completed 1000 requests
    Finished 1000 requests
    
    
    Server Software:       
    Server Hostname:        localhost
    Server Port:            8080
    
    Document Path:          /x.png
    Document Length:        70 bytes
    
    Concurrency Level:      1000
    Time taken for tests:   0.498 seconds
    Complete requests:      1000
    Failed requests:        0
    Total transferred:      188000 bytes
    HTML transferred:       70000 bytes
    Requests per second:    2007.85 [#/sec] (mean)
    Time per request:       498.046 [ms] (mean)
    Time per request:       0.498 [ms] (mean, across all concurrent requests)
    Transfer rate:          368.63 [Kbytes/sec] received
    
    Connection Times (ms)
                  min  mean[+/-sd] median   max
    Connect:        0    1   3.2      0      11
    Processing:     5   73  63.3     48     237
    Waiting:        3   64  56.7     41     194
    Total:          5   74  66.0     48     247
    
    Percentage of the requests served within a certain time (ms)
      50%     48
      66%     63
      75%     76
      80%     88
      90%    216
      95%    225
      98%    229
      99%    234
     100%    247 (longest request)
    
    第 1 条附言  ·  2019-09-23 12:44:32 +08:00
    我收回说的这句话,java 只是在前几次跑的时候会比 php 慢,之后多次访问后会快很多,

    大概在同一个接口访问 5、6 遍后,耗时就低于 0.1 秒了,比 php 快了
    第 2 条附言  ·  2019-09-23 13:39:02 +08:00
    php7 使用 php-fpm 结果 1000 并发是 0.062 秒, 9000 并发我是在 0.46 秒之间波动(需要把 php-fpm 闲置进程时长调长,不然每个 10 秒都会把闲置进程回收再启用会产生不必要耗时)

    java tomcat 在多次访问后 1000 并发是 0.06 秒,9000 并发我是稳定在 0.5 秒左右

    整体感觉其实性能 php 与 java 已经区别不大。
    第 3 条附言  ·  2019-09-23 14:48:41 +08:00
    io 密集方面也就这样都差不多,语言的主要优势还是在计算密集需求里面

    写了几个程序算第 30 万个质数,

    c/c++耗时 2.8 秒 https://paste.ubuntu.com/p/Sm3rQYK3Kj/
    java 耗时 3.3 秒 https://paste.ubuntu.com/p/84Zyzr6w3V/
    golang 耗时 10.4 秒 https://paste.ubuntu.com/p/MSNWkJTvz6/
    php7.0 耗时 22.2 秒 https://paste.ubuntu.com/p/M7gj3XfxFM/
    第 4 条附言  ·  2019-09-23 15:02:36 +08:00
    JavaScript 耗时 3.5 秒 https://paste.ubuntu.com/p/rd8hYtxQc2/
    第 5 条附言  ·  2019-09-26 16:55:26 +08:00
    拉了最新的 php7.4 源码本机编译后跑同样的代码 h 耗时 20.1 秒,比 php7.0 快 2 秒,性能不行呀
    第 6 条附言  ·  2019-09-26 17:10:19 +08:00
    对 php7.4 开启 opcache 后 耗时 18 秒,还是性能不行
    第 7 条附言  ·  2019-10-14 10:51:40 +08:00
    php8.0 开启 jit 耗时 20 多秒



    https://i.loli.net/2019/10/14/R5bchsBoA3SGqQD.png
    第 8 条附言  ·  2019-10-15 09:09:01 +08:00
    python 2.7 耗时 65991 毫秒 https://paste.ubuntu.com/p/5jqjBKgBFB/
    第 9 条附言  ·  2019-12-09 06:52:26 +08:00
    强类型的 hhvm4 并没有比 php7 快多少,快了 1 秒的样子,放弃
    第 10 条附言  ·  2020-03-24 09:29:00 +08:00
    134 条回复    2021-11-26 08:27:26 +08:00
    1  2  
    metinfo
        1
    metinfo  
       2019-09-23 11:58:51 +08:00
    PHP7 确实效率提高了不少
    ccalywm
        2
    ccalywm  
       2019-09-23 11:59:43 +08:00   ❤️ 10
    PHP 是世界上最好的语言
    zgqq
        3
    zgqq  
       2019-09-23 12:10:40 +08:00   ❤️ 1
    你用原生的 php 和 封装了 n 层的 spring boot 比。。。
    srx1982
        4
    srx1982  
       2019-09-23 12:11:09 +08:00
    别用 spring 试试
    guyeu
        5
    guyeu  
       2019-09-23 12:23:56 +08:00
    不太了解 PHP,java 你可以把这个返回值抽出一个常量,应该会快很多。
    如果测试的对象是 Base64 的 decode,用循环试试。
    zjsxwc
        6
    zjsxwc  
    OP
       2019-09-23 12:35:52 +08:00
    @srx1982
    @zgqq


    我用 servlet 写了,跑在 Tomcat/9.0.22 上,耗时 0.259 秒,还是比 php 慢,要知道 php7 用的 server 是调试用的,上 php-fpm 会更快,


    $ ab -n 1000 -c 1000 "http://localhost:8080/servlet-test-1.0-SNAPSHOT/x.png"
    This is ApacheBench, Version 2.3 <$Revision: 1757674 $>
    Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
    Licensed to The Apache Software Foundation, http://www.apache.org/

    Benchmarking localhost (be patient)
    Completed 100 requests
    Completed 200 requests
    Completed 300 requests
    Completed 400 requests
    Completed 500 requests
    Completed 600 requests
    Completed 700 requests
    Completed 800 requests
    Completed 900 requests
    Completed 1000 requests
    Finished 1000 requests


    Server Software:
    Server Hostname: localhost
    Server Port: 8080

    Document Path: /servlet-test-1.0-SNAPSHOT/x.png
    Document Length: 70 bytes

    Concurrency Level: 1000
    Time taken for tests: 0.259 seconds
    Complete requests: 1000
    Failed requests: 0
    Total transferred: 188000 bytes
    HTML transferred: 70000 bytes
    Requests per second: 3867.48 [#/sec] (mean)
    Time per request: 258.566 [ms] (mean)
    Time per request: 0.259 [ms] (mean, across all concurrent requests)
    Transfer rate: 710.05 [Kbytes/sec] received

    Connection Times (ms)
    min mean[+/-sd] median max
    Connect: 0 1 3.5 0 11
    Processing: 1 24 13.6 21 74
    Waiting: 1 22 12.5 19 72
    Total: 3 26 15.3 21 83

    Percentage of the requests served within a certain time (ms)
    50% 21
    66% 27
    75% 32
    80% 36
    90% 51
    95% 59
    98% 67
    99% 71
    100% 83 (longest request)





    代码:


    import java.io.IOException;
    import java.io.OutputStream;
    import java.util.Base64;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    /**
    * Servlet implementation class XServlet
    */
    public class XServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
    * @see HttpServlet#HttpServlet()
    */
    public XServlet() {
    super();
    // TODO Auto-generated constructor stub
    }

    /**
    * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
    */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setHeader("content-type","image/png");
    String onepointpngBase64 = "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWP4////fwAJ+wP9CNHoHgAAAABJRU5ErkJggg==";
    OutputStream os = response.getOutputStream();
    byte[] decodedValue = Base64.getDecoder().decode(onepointpngBase64);
    os.write(decodedValue);
    }

    /**
    * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
    */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
    doGet(request, response);
    }

    }
    zjsxwc
        7
    zjsxwc  
    OP
       2019-09-23 12:43:26 +08:00
    我收回说的这句话,java 只是在第一次跑的时候会比 php 慢,之后多次访问后会快很多
    reus
        8
    reus  
       2019-09-23 12:59:34 +08:00
    所以就是 java 没预热……
    auciou2
        9
    auciou2  
       2019-09-23 13:03:04 +08:00 via Android
    PHP 7.0 ~ 7.3 的速度差异不大。
    PHP 7.4 速度约是 7.3 的 1.8 ~ 2 倍。使用 PHP 7.4 测试,会更有惊喜。
    zjsxwc
        10
    zjsxwc  
    OP
       2019-09-23 13:45:32 +08:00
    @reus 是的


    不过最后测下来,感觉性能都差不多,和 io 有关把,我把 Linux ulimit 调到 10001 也是这个结果,再大我的电脑调不上去了,两者耗时还是差不多
    Xusually
        11
    Xusually  
       2019-09-23 14:50:07 +08:00   ❤️ 1
    PHP 你用的还是 7.0 如果用的是目前各大发行版仓库里默认的 7.2.22 或者换 7.3 系列估计还会有 10%-15%的提升。还在测试的 7.4 和 8 的效率就更高一些。
    zjsxwc
        12
    zjsxwc  
    OP
       2019-09-23 15:06:18 +08:00
    @Xusually

    我系统是 Linux Deepin,apt install php 给我装了 7.0,就没有去换,汗
    iminto
        13
    iminto  
       2019-09-23 15:26:10 +08:00
    其实是 JDK 内置的 Base64 太慢了,而且基于 servlet 的模式也不快
    chengyiqun
        14
    chengyiqun  
       2019-09-23 15:53:37 +08:00
    java 预热以后, 性能才能体现出来. 预热后变成机器码, 性能才接近 C++
    -XX:CompileThreshold
    这个参数了解下.
    richzhu
        15
    richzhu  
       2019-09-23 15:58:16 +08:00
    😱不会吧 go 这么差的嘛
    iminto
        16
    iminto  
       2019-09-23 16:13:47 +08:00
    @iminto 用 vert.x 跑 HTTP 服务性能会好很多,再用上 JODD 里的 base64。

    早期的 base64 性能测试: https://www.oschina.net/code/snippet_724468_15551
    wysnylc
        17
    wysnylc  
       2019-09-23 16:17:00 +08:00
    java12 之前有 jit
    12 有 zgc
    我这个挖掘机好难开还没铲子快,大概就是你这个问题的比喻
    gz911122
        18
    gz911122  
       2019-09-23 16:18:14 +08:00
    可以用 vertx 试一下...
    spring 那一套调用栈都能超过 2 个屏幕...性能损耗比较大...
    Hanggi
        19
    Hanggi  
       2019-09-23 16:30:49 +08:00
    php 和 node.js 谁更快?
    反正 python 最慢。
    wengjin456123
        20
    wengjin456123  
       2019-09-23 16:34:53 +08:00
    PHP7 以后快了很多
    ben1024
        21
    ben1024  
       2019-09-23 16:35:44 +08:00
    不知 php7.4 + swoole 效果如何
    qq316107934
        22
    qq316107934  
       2019-09-23 16:39:52 +08:00
    别的结果看起来很合理,为什么 Golang 这么慢?
    Vegetable
        23
    Vegetable  
       2019-09-23 16:44:57 +08:00
    @qq316107934 试了一下,的确就是这么慢,我也很好奇...
    stabc
        24
    stabc  
       2019-09-23 16:49:25 +08:00
    PHP7 有脚本缓存吧,也就是说,段时间内大量执行同一代码,相当于在测试 C 语言的速度。
    icexin
        25
    icexin  
       2019-09-23 16:55:10 +08:00   ❤️ 1
    golang 慢是因为它里面的 int 在 64 位环境下是 64 位的,把其他语言换成 int64 时间就很接近了
    raincode
        26
    raincode  
       2019-09-23 16:56:48 +08:00
    nodejs 呢?
    cjh1095358798
        27
    cjh1095358798  
       2019-09-23 16:58:13 +08:00
    php 还是牛逼,js 也可以
    iPhoneXI
        28
    iPhoneXI  
       2019-09-23 16:58:35 +08:00 via Android
    @Hanggi Python 加个 uvloop 就快了
    xfriday
        29
    xfriday  
       2019-09-23 17:04:19 +08:00   ❤️ 1
    @icexin 确实有这个原因,golang 换成 int32,时间可以降低一半,我的 mbp 是 5.29s ,还是和 java 有点差距,js 为啥那么牛批?-_-b
    xnode
        30
    xnode  
       2019-09-23 17:05:36 +08:00
    php 的效率并不低,php 令人诟病的是 fpm 的模式的效率 以及不规范的开发模式 .换句话说 php 的天花板低
    photon006
        31
    photon006  
       2019-09-23 17:06:04 +08:00
    我测了 node.js ,v10.13.0 长期支持版,代码:
    ```
    'use strict';
    const http = require('http');

    http.createServer(function (req, res) {
    let data = 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWP4////fwAJ+wP9CNHoHgAAAABJRU5ErkJggg==';
    // console.time('耗时:')
    let buff = Buffer.from(data, 'base64');
    let text = buff.toString('ascii');
    // console.timeEnd('耗时:')
    res.writeHead(200, {'Content-type': 'image/png'});
    res.write('asdfasd');
    res.end();
    }).listen(8080);
    ```


    ubuntu 18.04 安装 AB:
    sudo apt install apache2-utils

    测试代码:ab -n 1000 -c 1000 "http://localhost:8080/"

    测出结果程序启动第一次:Time per request: 0.350 [ms] (mean, across all concurrent requests)
    再测,维持在 0.160ms 左右


    这个跟 cpu 有关吧
    xfriday
        32
    xfriday  
       2019-09-23 17:07:07 +08:00   ❤️ 1
    看来 js (浏览器端)除了没法多线程,性能已经优化到 java 级别了
    Vegetable
        33
    Vegetable  
       2019-09-23 17:08:08 +08:00
    @xfriday 因为 js 也是 jit 吧,pypy3 我这里也可以达到六七秒的样子。
    我这里 go1.13 是 12s,pypy 七点几。java 换成 long 是 11s 多,go 换 int32 是 7.5 左右,没降到一半,大概还有别的原因。
    zjsxwc
        34
    zjsxwc  
    OP
       2019-09-23 17:10:58 +08:00
    @iminto

    我用 golang,9000 并发时可以稳定在 0.35 秒左右
    我用 c++写,9000 并发时可以在 0.5 秒左右 ( https://github.com/zjsxwc/xpng-test/blob/master/src/controller/MyController.hpp#L149
    都是在一个数量级,差别不大
    tanranran
        35
    tanranran  
       2019-09-23 17:12:58 +08:00
    @xfriday #32 #32 JS 现在可以通过 worker 实现多线程
    photon006
        36
    photon006  
       2019-09-23 17:13:07 +08:00
    @xfriday 浏览器也可以用多线程,公司目前有个上传文件功能,做了大文件、批量上传、进度条、断点续传功能,但要保证文件 100%可靠,后台我用 node 异步计算 md5,客户端我打算让前端同学用 web worker 实现。
    stevenhawking
        37
    stevenhawking  
       2019-09-23 17:16:23 +08:00
    原来是友军
    xfriday
        38
    xfriday  
       2019-09-23 17:18:32 +08:00
    @tanranran @photon006 是的,通过 web worker,js 也可以玩多线程了
    keepeye
        39
    keepeye  
       2019-09-23 17:19:35 +08:00
    golang int32 效率提升 40% 禁用 gc 没有啥提升 但还是比较慢 好奇原因
    qsbaq
        40
    qsbaq  
       2019-09-23 17:22:39 +08:00   ❤️ 1
    楼猪,你有没有把 PHP 的 OPCACHE 打开?
    zjsxwc
        41
    zjsxwc  
    OP
       2019-09-23 17:23:09 +08:00 via Android   ❤️ 1
    @qsbaq #40 原文:“楼猪,你有没有把 PHP 的 OPCACHE 打开?”
    回复:没开
    gimp
        42
    gimp  
       2019-09-23 17:30:21 +08:00
    我运行楼主的 node.js 代码
    2871 ms

    翻译成 Rust,4701ms ... (思考脸

    看有的回复提到变量类型,遂把 n, i, j 从 i32 换成 u32 和 u8 类型代替后,49ms ... (思考脸
    notreami
        43
    notreami  
       2019-09-23 17:34:15 +08:00   ❤️ 1
    2019 年了,能活下来的,性能、周边、背书、易用都不会太差。
    2019 年了,考验的是某个领域的杀手锏工具,比如 java 的大数据领域、python 的 AI 领域、golang 的运维工具领域、js 的前端领域。而 php 在最近 10 年,好像没啥特别领域突破。
    qsbaq
        44
    qsbaq  
       2019-09-23 17:34:58 +08:00
    @zjsxwc 打开 opcache 再试,PHP 会比现在的速度快 N 倍
    cloudzhou
        45
    cloudzhou  
       2019-09-23 17:38:27 +08:00   ❤️ 1
    https://paste.ubuntu.com/p/JCRRGCCqYx/ ,修改了一点小逻辑

    在我的机器里:
    @X220:/tmp$ java -cp . pn
    第 300000 个素数的值是:4256233 耗时 4911 毫秒
    @X220:/tmp$ go run /tmp//tt.go
    第 300000 个素数的值是:4256233 耗时 5165 毫秒

    非常接近
    photon006
        47
    photon006  
       2019-09-23 17:42:56 +08:00
    上面 node 代码改下,返回值固定死了,应该是这样:
    ```
    'use strict';
    const http = require('http');

    http.createServer(function (req, res) {
    let data = 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWP4////fwAJ+wP9CNHoHgAAAABJRU5ErkJggg==';
    // console.time('耗时:')
    let buff = Buffer.from(data, 'base64');
    let text = buff.toString('ascii');
    // console.timeEnd('耗时:')
    res.writeHead(200, {'Content-type': 'image/png'});
    res.write('text');
    res.end();
    }).listen(8080);

    ```

    在 raspberry pi4 上运行,node 还是 10.13.0LTS

    冷启动:0.6ms
    重试维持在 0.430ms
    Rekkles
        48
    Rekkles  
       2019-09-23 17:44:35 +08:00
    开 fpm + opcache 会快的你怀疑人生
    Mac
        49
    Mac  
       2019-09-23 17:47:23 +08:00 via Android   ❤️ 2
    opcache 不开谈什么快😂
    zjsxwc
        50
    zjsxwc  
    OP
       2019-09-23 17:51:09 +08:00 via Android
    @Mac
    @Rekkles
    @qsbaq

    我上面说了不开 opcache web 访问速度也都一样,
    计算密集的 cli 程序怎么用 opcache
    silenceeeee
        51
    silenceeeee  
       2019-09-23 17:55:30 +08:00
    PHP 为啥这么慢,有没有大神解释下原因
    shansing
        52
    shansing  
       2019-09-23 18:03:20 +08:00
    @auciou2 你记错了吧。7.2 相对 7.0 才叫提升大。7.4 相对 7.3 没差多少啊。
    zhuzeitou
        53
    zhuzeitou  
       2019-09-23 18:03:48 +08:00   ❤️ 6
    @cloudzhou `if j > i/j {`这个分支的改动对 java 的影响微乎其微,但对 golang 影响很大
    另外,在`if i%j == 0`这个分支最后加一个`continue`,会有惊喜……

    https://paste.ubuntu.com/p/3X9hB4tdzc/
    xfriday
        54
    xfriday  
       2019-09-23 18:09:22 +08:00
    @zhuzeitou 你也是鬼才,你说的那个 continue 居然能提高 1s 多,go 的编译器在搞啥哦
    dif
        55
    dif  
       2019-09-23 18:11:19 +08:00
    现在不玩性能了,都看生态已经关键领域的。
    fatelight
        56
    fatelight  
       2019-09-23 18:13:11 +08:00
    再你说得天花乱坠,我还是 java
    xfriday
        57
    xfriday  
       2019-09-23 18:13:34 +08:00
    上面那个 continue 加上直接比 c 还快了,2.24s 。。。golang 的 if 没优化好?
    ourleven
        58
    ourleven  
       2019-09-23 18:22:52 +08:00 via iPhone
    总结:
    Js 天下第一
    auciou2
        59
    auciou2  
       2019-09-23 18:25:46 +08:00
    @shansing 没有记错,5.3、5.4、5.5、5.6、7.0 ~ 7.4 我都逐个版本试过了。7.4 到 7.3 的提升很大。
    zhuzeitou
        60
    zhuzeitou  
       2019-09-23 18:29:26 +08:00   ❤️ 1
    @xfriday 我已经想不起来为啥我要试着加这个 continue 了

    然后又折腾了一下,把判断条件反了一下,好像还能提升一点点……

    https://paste.ubuntu.com/p/ByXy3gYfrW/
    askfilm
        61
    askfilm  
       2019-09-23 18:30:14 +08:00
    大家聊性能好嗨啊, 然而我业务还没写完呢 ~
    zjsxwc
        62
    zjsxwc  
    OP
       2019-09-23 18:34:15 +08:00 via Android
    @notreami #43 原文:“2019 年了,能活下来的,性能、周边、背书、易用都不会太差。2019 年了,考验的是某个领域的杀手锏工具,比如 java 的大数据领域、python 的 AI 领域、golang 的运维工具领域、js 的前端领域。而 php 在最近 10 年,好像没啥特别领域突破。”

    回复:

    php 好处在于讨好程序员领域吧,我写代码别的语言都不想用,只想写 php,因为可以无脑 php array 与 string 莽过去,array 可以当数组,可以当 map,可以当 object 用; string 可以当 char,可以当[]byte,可以当 intger,可以当 stream ;

    别的语言各种类型转换写起来比较烦躁。
    shansing
        63
    shansing  
       2019-09-23 18:38:00 +08:00
    @auciou2 我找到的公开资料不符合你的感觉噢:
    https://www.phoronix.com/scan.php?page=news_item&px=PHP-7.4-RC1-Released
    https://www.zimuel.it/blog/benchmarking_PHP74
    有提升但不并算很大。
    autogen
        64
    autogen  
       2019-09-23 18:47:18 +08:00
    // 来跟 C 比一下速度?
    printf("Content-type: image/png\n\n");
    write(stdout, base64_decode("iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWP4////fwAJ+wP9CNHoHgAAAABJRU5ErkJggg=="));
    auciou2
        65
    auciou2  
       2019-09-23 18:50:22 +08:00   ❤️ 1
    @shansing 是的,那个公开资料我之前看过。实际的测试数据,和那个资料是不一样的。我的测试数据,是循环 100 万次时间太短,所以循环 1000 万次。
    这 2 个月在开发一键 LAMP/LNMP,顺便把这些 PHP 的性能测试了一下。本来我一直用 PHP 5.3、5.5,速度也很快。

    测试结果,PHP 7.4 的执行速度约是 PHP 7.3 的 1.8 倍~ 2 倍; PHP 7.4 的执行速度约是 PHP 5.3 的 10 倍; PHP 7.4 的执行速度约是 PHP 5.5 的 5 倍多,PHP 7.0、7.1、7.2、7.3 的速度差异不大,这 4 个版本当时没有具体记录,大概最多是 20%-40%的差别。
    但是,PHP 7.3 到 PHP 7.4 这样大的提升,当时我十分吃惊。所以我的项目正在转向 PHP 7.4,也正在把 PHP 5 的程序都慢慢改写为 PHP 7,已经写了 2 个月。

    一个月前当时的一点测试记录:
    环境为 Ubuntu、Debian+Apache,执行 1000 万次的循环程序,测试结果如:

    PHP 执行时间:(单位:微秒)
    PHP 7.4 0.045616865158081 (Ubuntu 16+PPA)
    PHP 7.0 0.099370956420898 (Debian 9) (PHP 7.0 ~ 7.3 变化不太大)
    PHP 5.3 0.52340078353882 (Ubuntu 12)
    PHP 5.5.9 0.25087404251099 (Ubuntu 14)

    在高并发时可能会有很大的差别。PHP 的瓶颈主要是在网络线路,MySQL,或者数据库的设计。
    zjsxwc
        66
    zjsxwc  
    OP
       2019-09-23 18:54:45 +08:00 via Android
    @autogen #64 原文:“// 来跟 C 比一下速度? printf("Content-type: image/png\n\n");write(stdout, base64_decode("iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWP4////fwAJ+wP9CNHoHgAAAABJRU5ErkJggg=="));”
    回复:



    cgi 吗?没试过,我上面有 c++的 web 例子,不过已经可以得出总结,在 web 服务端开发领域所有语言基本都能撑满到目前 io 极限,在我的电脑里都是 0.5 秒处理完 9000 并发的。


    目前也就是在 cpu 计算密集领域这些语言性能还会有要求。
    auciou2
        67
    auciou2  
       2019-09-23 19:02:06 +08:00
    @shansing 总之,大家转到 PHP 7.4,会有不少惊喜。
    PHP 7 有些语法和 PHP 5 不一样,比 PHP 5 严格。所以 PHP 编程者应该尽快抛弃 PHP 5 的开发,并不是因为性能的原因,因为性能只有 PHP 7.4 的 PHP 5.3,速度也很快。PHP 的瓶颈主要是网络线路。

    转向 PHP 7 开发的原因是语法、巨大的工作量的原因,原来在 PHP 5 下的很多程序,到了 PHP 7 就会报错。所以一步到位写 PHP 7 的程序,可以省掉很大的工作量。PHP 5 程序改为 PHP 7,需要对所有的模块重新逐一测试,估计占到原始开发量的工作量的 10%-15%左右,工作量非常巨大。
    auciou2
        68
    auciou2  
       2019-09-23 19:02:44 +08:00
    修改:因为性能只有 PHP 7.4 的 1/10 的 PHP 5.3,速度也很快。
    lscho
        69
    lscho  
       2019-09-23 19:23:35 +08:00 via Android
    不是,为什么有人觉得 php 内置函数慢?
    cloudzhou
        70
    cloudzhou  
       2019-09-23 19:41:10 +08:00
    @zhuzeitou 还是你骚

    我的优化逻辑上是通的,因为减少一次 if 判读以及求余计算
    我猜测和编译器优化有关,比如进行内联等,continue 应该是直接 go to 到 for {} 入口

    基本上来说,这些测评的作用是很有限的,在非常单一的计算测试中,考验的只是局部的某点优化
    agdhole
        71
    agdhole  
       2019-09-23 19:48:42 +08:00
    看着快,实际上没人会直接拿来这么用
    把业务堆上去,PHP 只能往后稍稍
    rrfeng
        72
    rrfeng  
       2019-09-23 19:53:42 +08:00 via Android
    这种测试没意义啊,你用 netty 起个 socket 直接返回字符试试,更快。
    godoway
        73
    godoway  
       2019-09-23 20:27:29 +08:00 via Android
    Java 上 vertx 试试,或者看这里现成的结果。
    https://www.techempower.com/benchmarks/#section=data-r18&hw=ph&test=db
    zhuzeitou
        74
    zhuzeitou  
       2019-09-23 20:32:59 +08:00
    @cloudzhou 嗯,感觉和跳转的优化有关,后面改着改着以为自己在玩 Human Resource Machine……
    areless
        75
    areless  
       2019-09-23 20:40:46 +08:00   ❤️ 1
    目前在编程语言上遇到瓶颈的公司是没有的。阿里、新浪、facebook 也不是因为语言性能问题换掉 PHP 的,而是大厂的阵营问题,套路,发布会,秀,娱乐圈精髓要带进来,网红文化,敏捷开发,概念化,生态化反 =___=
    romisanic
        76
    romisanic  
       2019-09-23 20:42:01 +08:00
    性能测试都要预热的啊。。。。
    des
        77
    des  
       2019-09-23 20:51:28 +08:00 via Android
    web worker 不是多进程么?
    多线程不是这个么?
    https://nodejs.org/dist/latest-v12.x/docs/api/worker_threads.html
    zy445566
        78
    zy445566  
       2019-09-23 21:05:24 +08:00 via Android
    @Hanggi
    @raincode
    @photon006
    @gimp
    @ourleven
    这个用 node 去比没有意义,这种压测加 base64 就变成 CPU 密集运算了,会有一定会对其它请求有柱塞。这个反而多线程会占优势。要是 node 读写文件混打 sql 查询,node 肯定秒了其它语言
    GoLand
        79
    GoLand  
       2019-09-23 22:08:08 +08:00   ❤️ 1
    areless
        80
    areless  
       2019-09-23 22:30:44 +08:00
    第 30 万个质数
    PHP 用 gmp_nextprime 函数能在 10 秒内。
    chocotan
        81
    chocotan  
       2019-09-23 22:40:36 +08:00
    楼主你只是证明了比 Spring Boot 快而已
    emeab
        82
    emeab  
       2019-09-23 22:58:59 +08:00
    @areless 难道不是 php 容易被腐化吗 项目一大 人一多 遇到不规范的贼乱
    Vegetable
        83
    Vegetable  
       2019-09-24 00:00:04 +08:00
    @gimp u8 是 uint8 吗?这地方够大吗
    340244120w
        84
    340244120w  
       2019-09-24 00:17:21 +08:00 via Android
    spring 本来性能就弱,你看看调用链有多长。。。我用过的一个非 servlet 框架,有的测试是 spring 的三十多倍
    jason19659
        85
    jason19659  
       2019-09-24 01:04:12 +08:00
    这点东西能测出个啥。。
    KasuganoSoras
        86
    KasuganoSoras  
       2019-09-24 02:44:35 +08:00
    测试了一下 PHP 7.3.8 + Swoole 的服务器

    <?php
    $http = new Swoole\Http\Server("0.0.0.0", 880);
    $http->on('request', function ($request, $response) {
    $response->header("Content-type", "image/png");
    $response->end(base64_decode("iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWP4////fwAJ+wP9CNHoHgAAAABJRU5ErkJggg=="));
    });
    $http->start();

    测试结果:0.089ms



    Swoole 果然还是快,吹爆
    KasuganoSoras
        87
    KasuganoSoras  
       2019-09-24 02:45:56 +08:00
    @KasuganoSoras #86 是 0.084ms,写错了
    az422
        88
    az422  
       2019-09-24 07:03:41 +08:00 via Android   ❤️ 1
    看了下楼主的 ab 命令,应用部署和 ab 压测在同一台机器吧?这样就容易不准了。还有楼主压测机器参数是什么?然后一般来说,单个 ab 用-c1000,-n1000 这样比例搭配不合理,会导致 ab 线程调度完请求也完成了,ab 本身没预热好。建议楼主,
    1.分开机器压测(局域网内)
    2.ab 参数类似-c200-n10000 这样试试
    3.一般不用直接-c1000,而是通过多个 ab 命令达到 1000,比如脚本
    ab -c 300 xxx. &
    ab -c 300 xxx. &
    ab -c 400 xxx
    wait
    xiaotuzi
        89
    xiaotuzi  
       2019-09-24 08:00:02 +08:00 via iPhone
    @qsbaq 亲测,打开了 opcache 也一样,我是本地 Windows 10,cli 执行,我用 php7.3 测的,结果是 28s+,用 PHP7.0 没有开 opcache 测出结果是 23s+,我也是 PHPer,不吹不黑,可以自己测一下。
    mcfog
        90
    mcfog  
       2019-09-24 08:09:45 +08:00 via Android
    未经优化 php5 都比 java 快,正常操作
    上了 laravel php7.4 比裸 php5 慢,正常操作
    上 spring 慢多少我没概念

    合理的优化过后,什么 php5 还是 7,java 还是 python,laravel 还是 spring 全都不是瓶颈

    github 还用着 RoR 呢啥时候性能有问题了
    ichubei
        91
    ichubei  
       2019-09-24 08:25:10 +08:00 via iPhone
    那也无法阻挡 php 的没落……
    gimp
        92
    gimp  
       2019-09-24 08:36:19 +08:00
    @Vegetable 搞错了,,放不下 =,=
    wo642436249
        93
    wo642436249  
       2019-09-24 08:37:15 +08:00
    照我的理解,java、go 之类的代码,是启动时候直接加载到内存中了,单凭这个就很快了,而 php 大多是跑在 fmp 中的,每次请求都重新拉起进程,这样很慢,如果把 php 加载内存中,比如结合 swoole,那破 java 也很容易
    encro
        94
    encro  
       2019-09-24 09:08:28 +08:00
    PHP 最大问题在于没有线程(线程基本是废物大多用的是 nts 版本),只有进程,所以需要配合 swoole 之类,
    但是用 swoole 写的代码即使再怎么优化,肯定不如我写了几天的 go。

    效率是:单进程<多进程<多线程<协程

    比如我们开发公司微信消息服务,做活动的时候一分钟会来几千个请求,收到请求后我们又去请求微信,由于微信相应通常要 60-200MS,这时候用 PHP 一个进程需要 20M 内存耗着,用 JAVA 一个线程也需要几十几百 K,但是 GO 最少只需要 2K。

    意味着,一台 128G 内存的机器,PHP 也就跑几千并发,java/swoole 可以跑几万几百万并发,而 Go 可以单机几百万并发。
    encro
        95
    encro  
       2019-09-24 09:12:52 +08:00
    @KasuganoSoras 你的那个结果报错了。。。
    crazjieb
        96
    crazjieb  
       2019-09-24 09:17:21 +08:00
    你在想 peach
    saeed
        97
    saeed  
       2019-09-24 09:17:58 +08:00
    java: 你没有用设计模式,要重新比! php: qnmd
    raincode
        98
    raincode  
       2019-09-24 09:26:27 +08:00
    有没有谁用 rust 测测,想知道结果
    anyuhanfei
        99
    anyuhanfei  
       2019-09-24 09:38:14 +08:00
    学算法的时候,用 python3 写一遍,用 php7.3 写一遍,基本上每个算法都比 python3 快一半
    hhh798
        100
    hhh798  
       2019-09-24 09:55:59 +08:00
    @encro nodejs 能跑多少呢?
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1839 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 16:30 · PVG 00:30 · LAX 09:30 · JFK 12:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.