内容简介:最近一段时间学习了一下 Go 这门语言,其中提到最多的就是 GoLang 的高性能 & 高并发,所以本着没有对比就没有伤害的原则,我准备将其与另外两个我所掌握的语言(Python、Java)进行一个简单的性能对比。我的 MacBook Pro,12个逻辑CPU + 16G内存
最近一段时间学习了一下 Go 这门语言,其中提到最多的就是 GoLang 的高性能 & 高并发,所以本着没有对比就没有伤害的原则,我准备将其与另外两个我所掌握的语言(Python、Java)进行一个简单的性能对比。
测试环境
我的 MacBook Pro,12个逻辑CPU + 16G内存
测试工具
wrk -t8 -c100 -d30s --latency http://www.baidu.com
模拟8线程、100个并发,持续30秒的性能测试
实现
以下程序完整源码已放在 GitHub: https://github.com/Panmax/web-benchmark
Python
框架: Flask
容器:Gunicorn
运行环境:Docker
核心代码:
# -*- coding: utf-8 -*- from flask import Flask app = Flask(__name__) @app.route("/") def hello(): return "Hello Python!" if __name__ == '__main__': app.run()
Dockerfile
FROM ubuntu:14.04 ADD sources.list /etc/apt/sources.list ADD pip.conf ~/.pip/pip.conf # Update OS # RUN sed -i 's/# \(.*multiverse$\)/\1/g' /etc/apt/sources.list RUN apt-get update RUN apt-get -y upgrade # Install Python RUN apt-get install -y python-dev python-pip # Add requirements.txt ADD requirements.txt /webapp/requirements.txt # Install gunicorn Python web server RUN pip install gunicorn==19.6.0 # Install app requirements RUN pip install -r /webapp/requirements.txt # Create app directory ADD . /webapp # Set the default directory for our environment ENV HOME /webapp WORKDIR /webapp # Expose port 5000 for gunicorn EXPOSE 5000 ENTRYPOINT ["gunicorn", "-w", "24", "wsgi:app", "-b", "0.0.0.0:5000", "-n", "docker-flask", "--timeout", "45", "--max-requests", "10000"]
这里设置 24 个 worker,因为我的机器有 12 个逻辑CPU
启动命令
docker build -t panmax/docker-flask-benchmark . docker run -d --name docker-flask-benchmark --restart=always -p 8081:5000 panmax/docker-flask-benchmark
Java
框架: SpringBoot
容器采用 SpringBoot
的默认 tomcat
容器,不进行其他修改。
核心代码
package com.jpanj.benchmark; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @SpringBootApplication @RestController public class BenchmarkApplication { public static void main(String[] args) { SpringApplication.run(BenchmarkApplication.class, args); } @GetMapping public String hello() { return "Hello Java!"; } }
配置文件
server: port: 8082
启动命令
./gradlew build -xtest cd build/libs java -jar benchmark-0.0.1-SNAPSHOT.jar
GoLang
框架: Gin
不需要配置任何容器
核心代码
package main import ( "github.com/gin-gonic/gin" "net/http" ) func main() { router := gin.Default() router.GET("", func(c *gin.Context) { c.String(http.StatusOK, "Hello GoLang!") }) router.Run(":8083") }
启动命令
go build . ./gin-benchmark
go build 可以直接编译出一个可以执行文件,这个二进制文件可以直接放在其他机器上无需安装任何环境就可以运行起来,甚至可以在 Mac 上编译 Linux / Windows 的可执行文件,在 Linux 上编译 Mac / Windows 的可执行文件,这个特性非常爽。
通过浏览器可以验证以上使用 3 种语言开发的简单 Web 程序已经启起来了:
接下来我们逐个进行性能测试:
Python
➜ wrk -t8 -c100 -d30s --latency http://127.0.0.1:8081/ Running 30s test @ http://127.0.0.1:8081/ 8 threads and 100 connections Thread Stats Avg Stdev Max +/- Stdev Latency 21.45ms 12.75ms 237.13ms 85.43% Req/Sec 332.10 111.19 640.00 71.40% Latency Distribution 50% 19.20ms 75% 26.01ms 90% 33.23ms 99% 90.03ms 15917 requests in 30.08s, 2.63MB read Socket errors: connect 0, read 560, write 0, timeout 0 Requests/sec: 529.21 Transfer/sec: 89.41KB
Java
➜ wrk -t8 -c100 -d30s --latency http://127.0.0.1:8082/ Running 30s test @ http://127.0.0.1:8082/ 8 threads and 100 connections Thread Stats Avg Stdev Max +/- Stdev Latency 8.22ms 26.99ms 438.58ms 93.31% Req/Sec 6.93k 3.00k 16.38k 50.11% Latency Distribution 50% 1.26ms 75% 2.09ms 90% 12.81ms 99% 132.29ms 1631200 requests in 30.06s, 194.75MB read Requests/sec: 54256.97 Transfer/sec: 6.48MB
GoLang
➜ wrk -t8 -c100 -d30s --latency http://127.0.0.1:8083/ Running 30s test @ http://127.0.0.1:8083/ 8 threads and 100 connections Thread Stats Avg Stdev Max +/- Stdev Latency 1.80ms 1.95ms 24.69ms 85.85% Req/Sec 8.68k 786.97 11.03k 65.72% Latency Distribution 50% 1.36ms 75% 2.68ms 90% 4.32ms 99% 8.42ms 2078830 requests in 30.10s, 257.73MB read Requests/sec: 69064.35 Transfer/sec: 8.56MB
可以看到,在每秒请求数量(Requests/sec),也就是并发能力方面,测试结果为:
- Python: 529.21
- Java: 54256.97
- GoLang: 69064.35
线程平均延迟(Thread Stats - Avg - Latency)的测试结果为:
- Python: 21.45ms
- Java: 8.22ms
- GoLang: 1.80ms
可以看出,Go 在性能方面甩出 Python 几十条街是没有问题的,比 Java 的性能确实也好很多。
最后说明一下,这个测试可能存在不严谨性,但是我所采用的部署方案是大部分公司或者 程序员 最常使用的方式,也能在一定程度上说明问题。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 微服务测试之性能测试
- Go 单元测试和性能测试
- 性能测试vs压力测试vs负载测试
- SpringBoot | 第十三章:测试相关(单元测试、性能测试)
- Golang 性能测试 (2) 性能分析
- 随行付微服务测试之性能测试 原 荐
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Algorithms
Sanjoy Dasgupta、Christos H. Papadimitriou、Umesh Vazirani / McGraw-Hill Education / 2006-10-16 / GBP 30.99
This text, extensively class-tested over a decade at UC Berkeley and UC San Diego, explains the fundamentals of algorithms in a story line that makes the material enjoyable and easy to digest. Emphasi......一起来看看 《Algorithms》 这本书的介绍吧!