Node.js, Go, Python, OpenResty Benchmark

简介:

心血来潮,简单测试一下各种语言写的API Server的性能。

前言

我已经用过很多Web框架了。Python-httplib, Python-Flask,Python-Tornado,Node-http, Node-Express,Node-koa,Node-restify, Go-http。最近在做OpenAPI,用了一个开源组件Kong,后来觉得这玩意虽然设计的不错但是碍手碍脚,有一些功能还是需要深入底层去自己研究实现。后来发现Kong是基于OpenResty实现的,而OpenResty则是Nginx的一个“Bundle”,打好了很多方便的包,性能很不错的样子。正好籍由此次机会,测试一下各语言写的裸API性能。

所有Server端使用HelloWorld Server,即发送”Hello, World”字符串作为Body。
测试Client一并使用ab -kc10 -n50000进行。
测试环境Server与Client位于同一级房的两台相邻物理机。规格为: CPU: Intel(R) Xeon(R) CPU E5-2430 0 @ 2.20GHz 24核, 内存100G。

只是简单测试一下。

测试Server用例

Node.js单进程

 
  1. var http = require('http');
  2. var server = http.createServer( (req, res) => {
  3. res.writeHead(200, {'Content-Type': 'text/plain'});
  4. res.end("Hello, World");
  5. });
  6. server.listen(8080);

Node.js Cluster(24)

 
  1. const cluster = require('cluster');
  2. const http = require('http');
  3. const numCPUs = require('os').cpus().length;
  4. if (cluster.isMaster) {
  5. for (var i = 0; i < numCPUs; i++) {
  6. cluster.fork();
  7. }
  8. cluster.on('exit', (worker, code, signal) => {
  9. console.log(`worker ${worker.process.pid} died`);
  10. });
  11. } else {
  12. http.createServer((req, res) => {
  13. res.writeHead(200);
  14. res.end("Hello, World");
  15. }).listen(8080);
  16. }

Python-Tornado

 
  1. import tornado.ioloop
  2. import tornado.web
  3. class MainHandler(tornado.web.RequestHandler):
  4. def get(self):
  5. self.write("Hello, world")
  6. def make_app():
  7. return tornado.web.Application([
  8. (r"/", MainHandler),
  9. ])
  10. if __name__ == "__main__":
  11. app = make_app()
  12. app.listen(8080)
  13. tornado.ioloop.IOLoop.current().start()

Go-Http

 
  1. package main
  2. import (
  3. "io"
  4. "net/http"
  5. )
  6. func main() {
  7. http.HandleFunc("/", sayhello)
  8. http.ListenAndServe(":8080", nil)
  9. }
  10. func sayhello(w http.ResponseWriter, r *http.Request) {
  11. io.WriteString(w, "hello world")
  12. }

OpenResty(Nginx+lua)

 
  1. worker_processes 1;
  2. error_log logs/error.log;
  3. events {
  4. worker_connections 1024;
  5. }
  6. http {
  7. server {
  8. listen 8080;
  9. location / {
  10. default_type text/html;
  11. content_by_lua '
  12. ngx.say("<p>hello, world</p>")
  13. ';
  14. }
  15. }
  16. }

结果

对各种语言框架的最简EchoServer实现进行不同并发度的测试。结果如下:

c = 1

lang rps tpr (ms)
node 1x 2451.25 0.408
node 24x 1119.81 0.893
Py-Tornado 1301.68 0.768
Go-Http 7108.64 0.141
Nginx-lua 1x 7385.98 0.135
Nginx-lua 24x 7368.34 0.136

c = 10

lang rps tpr (ms)
node 1x 3944.75 2.535
node 24x 5645.11 1.771
Py-Tornado 1318.85 7.582
Go-Http 70085.24 0.143
Nginx-lua 1x 24753.79 0.404
Nginx-lua 24x 24824.98 0.403

c = 100

lang rps tpr (ms)
node 1x 4042.27 24.739
node 24x 5816.23 17.193
Py-Tornado 1283.43 78.261
Go-Http 77451.38 1.373
Nginx-lua 1x 25001.29 4.080
Nginx-lua 24x 70333.04 1.619

结论:

  • OpenResty(Nginx+Lua) 与 Go语言属于性能第一梯队。Node属于第二梯队,Python垫底……。
  • Go是特么的禽兽啊……
  • OpenResty也不错……。
目录
相关文章
|
20天前
|
Web App开发 JavaScript 前端开发
使用Python调用JavaScript进行网页自动化操作
使用Python调用JavaScript进行网页自动化操作
|
1月前
|
数据采集 存储 JavaScript
基于Python 爬书旗网小说数据并可视化,通过js逆向对抗网站反爬,想爬啥就爬啥
本文介绍了如何使用Python编写网络爬虫程序爬取书旗网上的小说数据,并通过逆向工程对抗网站的反爬机制,最后对采集的数据进行可视化分析。
基于Python 爬书旗网小说数据并可视化,通过js逆向对抗网站反爬,想爬啥就爬啥
|
1月前
|
JavaScript 算法 前端开发
国标哈希算法基础:SHA1、SHA256、SHA512、MD5 和 HMAC,Python和JS实现、加盐、算法魔改
国标哈希算法基础:SHA1、SHA256、SHA512、MD5 和 HMAC,Python和JS实现、加盐、算法魔改
173 1
|
19天前
|
Web App开发 JavaScript 前端开发
探索Node.js后端开发之旅深入浅出Python装饰器
【8月更文挑战第29天】在数字化时代,掌握一门后端编程语言变得尤为重要。Node.js作为一种基于JavaScript的服务端平台,因其高性能、轻量级的特性而广受欢迎。本文将引导读者了解Node.js的基本概念、核心模块以及如何利用它来构建一个简易的Web服务器。通过本文的学习,你将获得使用Node.js进行后端开发的初步技能,并理解其在现代Web开发中的应用价值。
|
1月前
|
JavaScript 前端开发 安全
Node.js和Go有何优势?
【8月更文挑战第4天】Node.js和Go有何优势?
32 3
|
1月前
|
Web App开发 JavaScript 前端开发
Node.js与Go语言的对比?
【8月更文挑战第4天】Node.js与Go语言的对比?
159 3
|
25天前
|
JavaScript Java Python
【Azure 应用服务】在Azure App Service for Windows 中部署Java/NodeJS/Python项目时,web.config的配置模板内容
【Azure 应用服务】在Azure App Service for Windows 中部署Java/NodeJS/Python项目时,web.config的配置模板内容
|
2月前
|
存储 Python 容器
Node中的AsyncLocalStorage 使用问题之在Python中,线程内变量的问题如何解决
Node中的AsyncLocalStorage 使用问题之在Python中,线程内变量的问题如何解决
|
2月前
|
机器学习/深度学习 数据采集 前端开发
网络爬虫开发:JavaScript与Python特性的小差异
我们以前写JavaScript的代码时,在遇到了发送请求时,都是需要去await的。 但是为什么Python代码不需要这样做呢? 这就是因为JavaScript是异步的,Python是同步的。 JavaScript就需要使用关键词await将异步代码块变为同步代码。
|
3月前
|
Java Go C#
编程语言C#、C++、Java、Python、go 选择哪个好?
我想说的是,不论选择哪种编程语言,决定选择的都是你最终的目的,做选择之前,先充分调研每一个选择项,再做选择思路就会非常清晰了。
81 3