最近要同事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路線沒錯。 后續我有空會分析下原理。