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也不错……。
目录
相关文章
|
2月前
|
JavaScript 前端开发 Python
用python执行js代码:PyExecJS库
文章讲述了如何使用PyExecJS库在Python环境中执行JavaScript代码,并提供了安装指南和示例代码。
112 1
用python执行js代码:PyExecJS库
|
1月前
|
算法 Go Python
获取指定范围符合正态分布的随机数Go/Python
获取指定范围符合正态分布的随机数Go/Python
33 0
|
1月前
|
前端开发 JavaScript API
JavaScript逆向爬取实战——使用Python实现列表页内容爬取(二)
JavaScript逆向爬取实战——使用Python实现列表页内容爬取(二)
|
1月前
|
数据采集 JavaScript 前端开发
JavaScript逆向爬虫——使用Python模拟执行JavaScript
JavaScript逆向爬虫——使用Python模拟执行JavaScript
|
1月前
|
前端开发 JavaScript API
JavaScript逆向爬取实战——使用Python实现列表页内容爬取(一)
JavaScript逆向爬取实战——使用Python实现列表页内容爬取(一)
|
2月前
|
JavaScript 前端开发 Python
python执行js代码
本文档详细介绍如何安装Node.js环境及PyExecJS库,并提供示例代码展示其功能。首先,通过指定链接安装Node.js,安装完毕后可在命令行中输入`node --version`来验证安装是否成功。接着,使用`pip install PyExecJS`安装PyExecJS库,该库允许Python程序执行JavaScript代码。文档还提供了多个示例代码,展示了如何在Python环境中执行和编译JavaScript代码,并可以选择特定的JavaScript运行时环境,如Node.js或JScript。最后,通过具体案例展示了PyExecJS的功能与使用方法。
33 3
|
2月前
|
JSON JavaScript 前端开发
6-19|Python数据传到JS的方法
6-19|Python数据传到JS的方法
|
3月前
|
数据采集 存储 JavaScript
基于Python 爬书旗网小说数据并可视化,通过js逆向对抗网站反爬,想爬啥就爬啥
本文介绍了如何使用Python编写网络爬虫程序爬取书旗网上的小说数据,并通过逆向工程对抗网站的反爬机制,最后对采集的数据进行可视化分析。
193 2
基于Python 爬书旗网小说数据并可视化,通过js逆向对抗网站反爬,想爬啥就爬啥
|
3月前
|
Web App开发 JavaScript 前端开发
使用Python调用JavaScript进行网页自动化操作
使用Python调用JavaScript进行网页自动化操作
|
3月前
|
JavaScript 算法 前端开发
国标哈希算法基础:SHA1、SHA256、SHA512、MD5 和 HMAC,Python和JS实现、加盐、算法魔改
国标哈希算法基础:SHA1、SHA256、SHA512、MD5 和 HMAC,Python和JS实现、加盐、算法魔改
481 1