zoukankan      html  css  js  c++  java
  • 2019年,Golang开始吊打Java性能了!!!

    最近要同事debug性能,不经意间发现现在Golang性能开始吊打Java了!!!感觉Go发展神速!! 之前Go和Java基本是平手,甚至还有较大差距,请见https://www.cnblogs.com/sunsky303/p/6506663.html。借此机会对比了下,Java/Go http server最近的性能,毕竟这是后端同学最关心的问题之一!!

    java 10 vs Golang1.12, Google上最快的2个http server性能PK, 压测10次,取平均值。

    Java

    import org.rapidoid.buffer.Buf;
    import org.rapidoid.http.AbstractHttpServer;
    import org.rapidoid.http.HttpStatus;
    import org.rapidoid.http.MediaType;
    import org.rapidoid.net.abstracts.Channel;
    import org.rapidoid.net.impl.RapidoidHelper;
    
    
    public class RapidoidHttpFast extends AbstractHttpServer
    {
     private static final int port = 8080;
     private static final byte HOME[] = "/".getBytes();
     private static final byte HELLO_WORLD[] = "Hello World".getBytes();
    
     @Override
     protected HttpStatus handle(Channel ctx, Buf buf, RapidoidHelper req)
     {
      if (req.isGet.value && matches(buf, req.path, HOME))
      {
       return ok(ctx, req.isKeepAlive.value, HELLO_WORLD, MediaType.TEXT_PLAIN);
      }
    
      return HttpStatus.NOT_FOUND;
     }
    
     public static void main(String[] args) throws Exception
     {
      new RapidoidHttpFast().listen(port);
     }
    }

    sysctl -n machdep.cpu.brand_string ;java --version ;java -cp ".:/Users/wuqj/Downloads/jar_files/*" HelloWorldExample
    Intel(R) Core(TM) i5-4278U CPU @ 2.60GHz
    java 10 2018-03-20
    Java(TM) SE Runtime Environment 18.3 (build 10+46)
    Java HotSpot(TM) 64-Bit Server VM 18.3 (build 10+46, mixed mode)
    19:50:33.353 [main] INFO o.r.config.RapidoidInitializer - Starting Rapidoid v5.5.5, built on 2018-05-27 15:45 UTC
    19:50:33.358 [main] INFO o.r.config.RapidoidInitializer - System info | os = Mac OS X | java = 10 | process = 17435@sun-pro.local | max memory = 2048 MB | dir = /labs/java
    19:50:33.639 [main] INFO org.rapidoid.env.Environment - No profiles were specified, activating 'default' profile
    19:50:33.645 [main] INFO org.rapidoid.env.Environment - No production/dev/test mode was configured, inferring mode | mode = DEV
    19:50:33.645 [main] INFO org.rapidoid.env.Environment - Initialized environment | mode = DEV | profiles = [default, dev]
    19:50:33.932 [main] INFO org.rapidoid.config.ConfigImpl - Loaded configuration | namespace = config | files = [built-in-config.yml, built-in-config-default.yml, built-in-config-dev.yml]
    19:50:34.065 [main] INFO o.rapidoid.http.impl.HttpRoutesImpl - GET / | setup = main | roles = [] | transaction = NONE | mvc = false | cacheTTL = 0
    19:50:34.072 [main] INFO org.rapidoid.setup.App - Inferred application root | main = HelloWorldExample | package =
    19:50:34.080 [main] INFO org.rapidoid.setup.WatchForChanges - Watching classpath for changes... | classpath = [/labs/java/.]
    19:50:34.175 [server] INFO o.r.net.impl.RapidoidServerLoop - Starting server | address = 0.0.0.0 | port = 8080 | I/O workers = 4 | sync = true | accept = non-blocking
    19:50:34.399 [main] INFO org.rapidoid.setup.Setup - Server has started | setup = main | home = http://localhost:8080
    19:50:34.400 [main] INFO org.rapidoid.setup.Setup - Static resources will be served from the following locations | setup = main | locations = [static, default/static]

    ab -c100 -n100000 -k 'http://127.0.0.1:8080/'
    This is ApacheBench, Version 2.3 <$Revision: 1826891 $>
    Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
    Licensed to The Apache Software Foundation, http://www.apache.org/
    
    Benchmarking 127.0.0.1 (be patient)
    Completed 10000 requests
    Completed 20000 requests
    Completed 30000 requests
    Completed 40000 requests
    Completed 50000 requests
    Completed 60000 requests
    Completed 70000 requests
    Completed 80000 requests
    Completed 90000 requests
    Completed 100000 requests
    Finished 100000 requests
    
    
    Server Software:        Rapidoid
    Server Hostname:        127.0.0.1
    Server Port:            8080
    
    Document Path:          /
    Document Length:        11 bytes
    
    Concurrency Level:      100
    Time taken for tests:   2.872 seconds
    Complete requests:      100000
    Failed requests:        0
    Keep-Alive requests:    100000
    Total transferred:      17000000 bytes
    HTML transferred:       1100000 bytes
    Requests per second:    34822.08 [#/sec] (mean)
    Time per request:       2.872 [ms] (mean)
    Time per request:       0.029 [ms] (mean, across all concurrent requests)
    Transfer rate:          5781.01 [Kbytes/sec] received
    
    Connection Times (ms)
                  min  mean[+/-sd] median   max
    Connect:        0    0   0.2      0      11
    Processing:     0    3   1.6      2      27
    Waiting:        0    3   1.6      2      27
    Total:          0    3   1.6      2      27
    
    Percentage of the requests served within a certain time (ms)
      50%      2
      66%      3
      75%      3
      80%      3
      90%      5
      95%      6
      98%      8
      99%      9
     100%     27 (longest request)

    Golang

    package main
    
    import (
        "flag"
        "fmt"
        "github.com/valyala/fasthttp"
        "log"
    )
    
    var (
        addr     = flag.String("addr", ":8080", "TCP address to listen to")
        compress = flag.Bool("compress", false, "Whether to enable transparent response compression")
    )
    
    func main() {
        flag.Parse()
        h := requestHandler
    
        if err := fasthttp.ListenAndServe(*addr, h); err != nil {
            log.Fatalf("Error in ListenAndServe: %s", err)
        }
    }
    
    func requestHandler(ctx *fasthttp.RequestCtx) {
        fmt.Fprintf(ctx, "Hello world")
    }
     sysctl -n machdep.cpu.brand_string ;go version ; go run ../fasthttp/helloworldserver.go
    Intel(R) Core(TM) i5-4278U CPU @ 2.60GHz
    go version go1.12.4 darwin/amd64

    ab -c100 -n100000 -k 'http://127.0.0.1:8080/'
    This is ApacheBench, Version 2.3 <$Revision: 1826891 $>
    Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
    Licensed to The Apache Software Foundation, http://www.apache.org/
    
    Benchmarking 127.0.0.1 (be patient)
    Completed 10000 requests
    Completed 20000 requests
    Completed 30000 requests
    Completed 40000 requests
    Completed 50000 requests
    Completed 60000 requests
    Completed 70000 requests
    Completed 80000 requests
    Completed 90000 requests
    Completed 100000 requests
    Finished 100000 requests
    
    
    Server Software:        fasthttp
    Server Hostname:        127.0.0.1
    Server Port:            8080
    
    Document Path:          /
    Document Length:        11 bytes
    
    Concurrency Level:      100
    Time taken for tests:   2.282 seconds
    Complete requests:      100000
    Failed requests:        0
    Keep-Alive requests:    100000
    Total transferred:      17000000 bytes
    HTML transferred:       1100000 bytes
    Requests per second:    43819.46 [#/sec] (mean)
    Time per request:       2.282 [ms] (mean)
    Time per request:       0.023 [ms] (mean, across all concurrent requests)
    Transfer rate:          7274.72 [Kbytes/sec] received
    
    Connection Times (ms)
                  min  mean[+/-sd] median   max
    Connect:        0    0   0.1      0       7
    Processing:     0    2   1.8      2     138
    Waiting:        0    2   1.8      2     138
    Total:          0    2   1.8      2     140
    
    Percentage of the requests served within a certain time (ms)
      50%      2
      66%      2
      75%      2
      80%      3
      90%      4
      95%      4
      98%      6
      99%      7
     100%    140 (longest request)
    QPS上 Go 43819.46吊打 Java 34822.08!!!

    看来走Golang路线没错。 后续我有空会分析下原理。

  • 相关阅读:
    ACM: SCU 4440 Rectangle
    ACM: NBUT 1646 Internet of Lights and Switches
    ACM: Long Live the Queen
    ACM: Racing Gems
    C++ 11 笔记 (一) : lambda
    cocos2d-x笔记2: 编译到安卓的步骤与注意事项
    C++笔记1: 单例模式。(一个简单的设计模式在C++中复杂出翔。。)
    Java笔记2 : 泛型的体现,及其上限、下限、通配符
    我终于忍不住喷一下某些书了,关于Java传引用的XX言论
    Java笔记1 : 在生产者消费者模式中,线程通信与共享数据,死锁问题与解决办法
  • 原文地址:https://www.cnblogs.com/sunsky303/p/11680025.html
Copyright © 2011-2022 走看看