内容简介:最近一段时间学习了一下 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) 性能分析
- 随行付微服务测试之性能测试 原 荐
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Linux/Unix设计思想
甘卡兹 / 漆犇 / 人民邮电出版社 / 2012-3-28 / 39.00元
《Linux\Unix设计思想/图灵程序设计丛书》内容简介:将Linux的开发方式与Unix的原理有效地结合起来,总结出Linux与Unix软件开发中的设计原则。《Linux\Unix设计思想/图灵程序设计丛书》前8章分别介绍了Linux与Unix中9条基本的哲学准则和10条次要准则。第9章和第10章将Unix系统的设计思想与其他系统的设计思想进行了对比。最后介绍了Unix哲学准则在其他领域中的应......一起来看看 《Linux/Unix设计思想》 这本书的介绍吧!