Python、Java、GoLang 基于 Web 的性能测试

栏目: 编程工具 · 发布时间: 5年前

内容简介:最近一段时间学习了一下 Go 这门语言,其中提到最多的就是 GoLang 的高性能 & 高并发,所以本着没有对比就没有伤害的原则,我准备将其与另外两个我所掌握的语言(Python、Java)进行一个简单的性能对比。我的 MacBook Pro,12个逻辑CPU + 16G内存

最近一段时间学习了一下 Go 这门语言,其中提到最多的就是 GoLang 的高性能 & 高并发,所以本着没有对比就没有伤害的原则,我准备将其与另外两个我所掌握的语言(Python、Java)进行一个简单的性能对比。

测试环境

我的 MacBook Pro,12个逻辑CPU + 16G内存

测试工具

https://github.com/wg/wrk

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、 <a href='https://www.codercto.com/topics/22013.html'>Java</a> 、GoLang 基于 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 的性能确实也好很多。

最后说明一下,这个测试可能存在不严谨性,但是我所采用的部署方案是大部分公司或者 程序员 最常使用的方式,也能在一定程度上说明问题。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

计算机程序设计艺术卷1:基本算法(英文版.第3版)

计算机程序设计艺术卷1:基本算法(英文版.第3版)

Donald E.Knuth / 人民邮电出版社 / 2010-10 / 119.00元

《计算机程序设计艺术》系列著作对计算机领域产生了深远的影响。这一系列堪称一项浩大的工程,自1962年开始编写,计划出版7卷,目前已经出版了4卷。《美国科学家》杂志曾将这套书与爱因斯坦的《相对论》等书并列称为20世纪最重要的12本物理学著作。目前Knuth正将毕生精力投入到这部史诗性著作的撰写中。想了解本书最新信息,请访http://www-cs-faculty.stanford.edu/~knut......一起来看看 《计算机程序设计艺术卷1:基本算法(英文版.第3版)》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试