当前位置: 首页 > 编程日记 > 正文

web编程速度大比拼(nodejs go python)(非专业对比)

C10K问题的解决,涌现出一大批新框架,或者新语言,那么问题来了:到底谁最快呢?非专业程序猿来个非专业对比。

比较程序:输出Hello World!

测试程序:siege –c 100 –r 100 –b

例子包括:

1.go用http模块实现的helloworld

2.go用martini微框架实现的Helloworld

3.python3 python2 pypy分别用gevent server  tornado实现的Hello world

4.python3 python2 pypy分别用微框架bottle+gevent实现的Hello world

5.NodeJS纯JS实现的Helloworld

6.NodeJS用express框架实现的Helloworld

测试平台:

公司老旧的奔腾平台 Pentium(R) Dual-Core  CPU      E6700  @ 3.20GHz

内存2GB(够弱了吧)

先来宇宙最快的GO的测试:

  1 package main
  2 
  3 import (
  4         "fmt"
  5         "net/http"
  6 )
  7 
  8 func sayhelloName(w http.ResponseWriter, r *http.Request){
  9         fmt.Fprintf(w, "hello world!")
 10 }
 11 
 12 func main() {
 13         http.HandleFunc("/", sayhelloName)
 14         http.ListenAndServe(":9090", nil)
 15 }

连续测试5次,成绩大体如下:

  1 Transactions:                  10000 hits
  2 Availability:                 100.00 %
  3 Elapsed time:                   4.11 secs
  4 Data transferred:               0.11 MB
  5 Response time:                  0.03 secs
  6 Transaction rate:            2433.09 trans/sec
  7 Throughput:                     0.03 MB/sec
  8 Concurrency:                   79.76
  9 Successful transactions:       10000
 10 Failed transactions:               0
 11 Longest transaction:            0.20
 12 Shortest transaction:           0.00

4.11秒,不错的成绩

再看NodeJS的例子:

  1 var http = require("http");
  2 http.createServer(function(request, response) {
  3     response.writeHead(200, {"Content-Type": "text/plain"});
  4     response.write("Hello World!");
  5     response.end();
  6 }).listen(8000);
  7 console.log("nodejs start listen 8888 port!");
  8 

测试结果如下:

  1 Transactions:                  10000 hits
  2 Availability:                 100.00 %
  3 Elapsed time:                   5.00 secs
  4 Data transferred:               0.11 MB
  5 Response time:                  0.04 secs
  6 Transaction rate:            2000.00 trans/sec
  7 Throughput:                     0.02 MB/sec
  8 Concurrency:                   86.84
  9 Successful transactions:       10000
 10 Failed transactions:               0
 11 Longest transaction:            0.17
 12 Shortest transaction:           0.00

5秒,比Go稍微慢一点

接下来是Python,由于python自带的wsgiref服务器,只是一个参考实现,性能很差,所以这里选用了两个性能不错的WSGI服务器gevent、tornado

gevent代码如下:

  1 #!/usr/bin/python
  2 from gevent import pywsgi
  3 
  4 def hello_world(env, start_response):
  5     if env['PATH_INFO'] == '/':
  6         start_response('200 OK', [('Content-Type', 'text/html')])
  7         return ["hello world"]
  8 
  9 print 'Serving on https://127.0.0.1:8000'
 10 server = pywsgi.WSGIServer(('0.0.0.0', 8000), hello_world )
 11 server.serve_forever()
 12 

tornado的代码如下:

  1 from tornado import httpserver
  2 from tornado import ioloop
  3 def handle_request(request):
  4     if request.uri=='/':
  5         message = b"Hello World!"
  6         request.write(b"HTTP/1.1 200 OK\r\nContent-Length: %d\r\n\r\n%s" % (
  7                  len(message), message))
  8         request.finish()
  9 
 10 http_server = httpserver.HTTPServer(handle_request)
 11 http_server.bind(8888)
 12 http_server.start()
 13 ioloop.IOLoop.instance().start()
 14 

由于python的例子要分别在python2 python3 pypy下跑,结果太多,我这里只给结果:

gevent:

python2:5.8秒,python3:7.5秒,pypy:4.8秒

有意思的是:pypy第一次跑用了6.8秒,第二次以后全是4.8秒(感觉原因是第一次由于jit浪费了一点时间)贴出某次pypy的成绩:

  1 Transactions:                  10000 hits
  2 Availability:                 100.00 %
  3 Elapsed time:                   4.77 secs
  4 Data transferred:               0.10 MB
  5 Response time:                  0.04 secs
  6 Transaction rate:            2096.44 trans/sec
  7 Throughput:                     0.02 MB/sec
  8 Concurrency:                   90.38
  9 Successful transactions:       10000
 10 Failed transactions:               0
 11 Longest transaction:            0.13
 12 Shortest transaction:           0.00
 13 

接下来是tornado:

python2:9.05秒,python3:8.6秒,pypy:5.95秒

同样:pypy第一次执行的时间为9.45秒,以后的每次只执行时间为5.9秒多一些

可以看出,pypy 与go nodejs性能相当,其中go最快为4.11秒,pypy+gevent与nodejs性能差不多,pypy稍好一点,pypy+tornado则稍慢于nodejs。

2。框架篇:

从上边例子可以看到,纯代码写起来还是比较麻烦的,一般我们都是用框架来写web,我选了几个轻量级的框架来输出helloworld:

go+martini

  1 package main
  2 
  3 import "github.com/codegangsta/martini"
  4 
  5 func main() {
  6   m := martini.Classic()
  7   m.Get("/", func() string {
  8     return "Hello world!"
  9   })
 10   m.Run()
 11 }
 12 

运行时间为:

  1 Transactions:                  10000 hits
  2 Availability:                 100.00 %
  3 Elapsed time:                   4.69 secs
  4 Data transferred:               0.11 MB
  5 Response time:                  0.04 secs
  6 Transaction rate:            2132.20 trans/sec
  7 Throughput:                     0.02 MB/sec
  8 Concurrency:                   90.23
  9 Successful transactions:       10000
 10 Failed transactions:               0
 11 Longest transaction:            0.17
 12 Shortest transaction:           0.00
 13 

nodejs+express:

  1 var express = require('express')
  2 var app = express()
  3  
  4 app.get('/', function (req, res) {
  5   res.send('Hello World')
  6 })
  7  
  8 app.listen(3000)

用时:

  1 Transactions:                  10000 hits
  2 Availability:                 100.00 %
  3 Elapsed time:                   5.90 secs
  4 Data transferred:               0.10 MB
  5 Response time:                  0.06 secs
  6 Transaction rate:            1694.92 trans/sec
  7 Throughput:                     0.02 MB/sec
  8 Concurrency:                   96.44
  9 Successful transactions:       10000
 10 Failed transactions:               0
 11 Longest transaction:            0.13
 12 Shortest transaction:           0.01
 13 

python gevent+bottle:

  1 from gevent import monkey
  2 monkey.patch_all()
  3 from bottle import run,get
  4 
  5 @get("/")
  6 def index():
  7     return "Hello world!"
  8 
  9 run(server='gevent')
 10 

用时:python2 10.05秒,python3:12.95秒,pypy:5.85秒

python tornado:

  1 import tornado.httpserver
  2 import tornado.ioloop
  3 import tornado.web
  4 
  5 class IndexHandler(tornado.web.RequestHandler):
  6     def get(self):
  7         self.write('Hello World!')
  8 
  9 if __name__ == "__main__":
 10     app = tornado.web.Application(handlers=[(r"/",IndexHandler)])
 11     http_server = tornado.httpserver.HTTPServer(app)
 12     http_server.listen(8000)
 13     tornado.ioloop.IOLoop.instance().start()
 14 

用时:python2 11.85秒,python3:11.79秒,pypy:6.65秒

总结:可以看到,python在开启jit技术的pypy上web响应速度已经略优于nodejs,跟golang还有一定差距,但在同一数量级,标准python就稍微慢一些。

转载于:https://www.cnblogs.com/yafengabc/p/5431695.html

相关文章:

linux邮件服务

邮件服务要求:l 能够构建完整的邮件系统 能够正确设置DNS邮件服务器记录 l 能够配置sendmail服务器 设置客户端软件使用邮件服务器 准备工作&#xff1a; l 主机名&#xff1a;srv.benet.com /etc/sysconfig/network <永久的> l 域名 正向区域 bt.com完成NDS的…

MaskFlownet:基于可学习遮挡掩模的非对称特征匹配丨CVPR 2020

来源 | 微软研究院AI头条&#xff08;ID: MSRAsia&#xff09;编者按&#xff1a;在光流预测任务中&#xff0c;形变带来的歧义与无效信息会干扰特征匹配的结果。在这篇 CVPR 2020 Oral 论文中&#xff0c;微软亚洲研究院提出了一种可学习遮挡掩模的非对称特征匹配模块 &#x…

GDB调试--以汇编语言为例

#rpm -qa |grep gdb 下载&#xff1a; 安装 #tar -zxvf #./configure #make 使用GDB 以汇编语言调试为例 汇编语言实现CPUID指令 CPUID cpuid是Intel Pentinum以上级CPU内置的一个指令&#xff08;486级以下的CPU不支持&#xff09;&#xff0c;他用于识别某一类型…

汇编语言系统调用过程

以printf为例&#xff0c;详细解析一个简单的printf调用里头&#xff0c;系统究竟做了什么&#xff0c;各寄存器究竟如何变化。 如何在汇编调用glibc的函数&#xff1f;其实也很简单&#xff0c;根据c convention call的规则&#xff0c;参数反向压栈&#xff0c;call&#xf…

switch语句中在case块里声明变量会遇到提示“Expected expression before...的问题

switch语句中在case块里声明变量会遇到提示“Expected expression before..."的问题 例如在如下代码中 1case constant:2 int i 1;3 int j 2;4 self.sum i j;5 break;GCC在case语句之后的第一行中声明变量时遇到问题。 这时需要在case块两端添加花括号&am…

帮AI体检看病一条龙服务,阿里发布“AI安全诊断大师”

如同一些出生免疫力就有缺陷的人一样&#xff0c;AI也存在免疫力缺陷。基于从源头打造安全免疫力的新一代安全架构理念&#xff0c;最近&#xff0c;阿里安全研究发布了一项核心技术“AI安全诊断大师”&#xff0c;可对AI模型全面体检&#xff0c;“看诊开方”&#xff0c;让AI…

Spring学习总结(7)——applicationContext.xml 配置文详解

web.xml中classpath:和classpath*: 有什么区别? classpath&#xff1a;只会到你的class路径中查找找文件; classpath*&#xff1a;不仅包含class路径&#xff0c;还包括jar文件中(class路径)进行查找. 存放位置&#xff1a; 1&#xff1a;src下面 需要在web.xml中定义如下&…

GDB查看栈信息

栈&#xff1a;是程序存放数据内存区域之一&#xff0c;特点是LIFO&#xff08;后进先出&#xff09;。 PUSH&#xff1a;入栈 POP&#xff1a;出战 使用场景&#xff1a; 1.保存动态分配的自动变量使用栈 2.函数调用时&#xff0c;用栈传递函数参数&#xff0c;半寸返回地址…

数据库学习之路

今天迎来入冬的第二场雪&#xff0c;闲来无事就整理了下总结下工作以来所有数据库方面的书籍和资料&#xff0c;发现了不少&#xff0c;很多已经读过或者正在读的书籍&#xff0c;oracle真的很强大&#xff0c;直到现在发现才入门的水平&#xff0c;当然很多书读一遍是不行的&a…

为什么铺天盖地都是Python的广告?

最近&#xff0c;知乎关于Python有一个热议问题&#xff1a; 甚至在抖音上&#xff0c;笔者有一次还看到Python占领了热搜&#xff01;应该有很多不懂技术的吃瓜群众也被Python的热度炒懵了……但是&#xff0c;Python真的值得学吗&#xff1f;真的值得花这么多钱去学吗&#x…

python3正则表达式符号和用法

转载于:https://www.cnblogs.com/wumac/p/5441322.html

从寄存器看I386和x64位中函数调用中参数传递

x86_64基本使用寄存器存储函数参数&#xff0c;寄存器不够才入栈&#xff1b; 而i386将所有参数保存在栈上&#xff0c;通过gcc的扩展功能__attribute__((regparm()))即可实现部分参数的寄存器传递。 调试语法&#xff1a; --《深入理解计算机系统(原书第2版)》 代码 #incl…

转:去掉Flex4生成的SWF加载时的进度条

方法一&#xff1a; <?xml version"1.0" encoding"utf-8"?> <s:Application xmlns:fx"http://ns.adobe.com/mxml/2009" xmlns:s"library://ns.adobe.com/flex/spark" xmlns:mx"library://ns.adobe.com/f…

饿了么交易系统5年演化史

作者 | 挽晴来源 | 阿里巴巴中间件&#xff08;ID&#xff1a;Aliware_2018&#xff09;个人简介:2014年12月加入饿了么&#xff0c;当时参与后台系统的研发(WalisJavis>Walle)&#xff0c;主要面向客服和BD。2015年5月开始接触订单系统的研发&#xff0c;7月负责订单研发组…

Python迁移MySQL数据到MongoDB脚本

MongoDB是一个文档数据库&#xff0c;在存储小文件方面存在天然优势。随着业务求的变化&#xff0c;需要将线上MySQL数据库中的行记录&#xff0c;导入到MongoDB中文档记录。 一、场景&#xff1a;线上MySQL数据库某表迁移到MongoDB&#xff0c;字段无变化。 二、Python模块&am…

使用valgrind分析C程序调用线路图

Valgrind可以检测内存泄漏和内存违例&#xff0c;但是用Valgrind生成的日志信息结合kcachegrind就可以查看C程序的执行线路图&#xff0c;调用时间&#xff0c;是做性能优化和查看代码的非常好的工具。 1.下载安装 Valgrind 安装 到www.valgrind.org下载最新版valgrind # wg…

纯CSS实现蓝色圆角下拉菜单

代码简介&#xff1a; 这个菜单没有使用任何的图片&#xff0c;完全是用CSS实现的&#xff0c;包括圆角效果也同样是&#xff0c;而且还考虑了多浏览器的兼容性&#xff0c;可以说非常不错&#xff0c;既兼容性好&#xff0c;又外观漂亮&#xff0c;下拉导航菜单目前比较流行&a…

生产型机器学习已经没那么困难了?

作者 | Caleb Kaiser译者 | 香槟超新星出品 | CSDN&#xff08;ID:CSDNnews&#xff09;封面图源自视觉中国在软件工程的诸多领域内&#xff0c;生产用例是相当标准化的。以Web开发为例&#xff0c;要在Web应用中实现身份认证&#xff0c;你不会去创造一个数据库&#xff0c;自…

poj1330Nearest Common Ancestors 1470 Closest Common Ancestors(LCA算法)

LCA思想&#xff1a;http://www.cnblogs.com/hujunzheng/p/3945885.html 在求解最近公共祖先为问题上&#xff0c;用到的是Tarjan的思想&#xff0c;从根结点开始形成一棵深搜树&#xff0c;非常好的处理技巧就是在回溯到结点u的时候&#xff0c;u的子树已经遍历&#xff0c;这…

干货 | 时间序列预测类问题下的建模方案探索实践

作者 | 陆春晖责编 | Carol出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;背景时间序列类问题是数据分析领域中一类常见的问题&#xff0c;人们有时需要通过观察某种现象一段时间的状态&#xff0c;来判断其未来一段时间的状态。而时间序列就是该种现象某一个统计指…

Redis安装与源码调试

linux版本&#xff1a;64位CentOS 6.5 Redis版本&#xff1a;redis-3.0.6 (更新到2016年1月22日) Redis官网&#xff1a;http://redis.io/ Redis常用命令&#xff1a;http://redis.io/commands 1.安装Redis # wget http://download.redis.io/releases/redis-3.2.6.tar.g…

system pause in C#

方法一&#xff1a; Console.Write("Press any key to continue . . . "); Console.ReadKey(true); 注&#xff1a;也可用ReadLine()或Read()&#xff0c;但是只能对回车进行响应&#xff0c;不能达到anykey的效果。 方法二&#xff1a; 1) 在源文件using处加入using…

C#设置当前程序通过IE代理服务器上网

注意&#xff1a;以下设置只在当前程序中有效&#xff0c;对IE浏览器无效&#xff0c;且关闭程序后&#xff0c;自动释放代码。 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.InteropServices;public static …

计算机科学精彩帖子收集

linux源码 LXR 源自“the Linux Cross Referencer”&#xff0c;中间的“X”形象地代表了“Cross”。与 Source Navigator 类似&#xff0c;它也是分析阅读源代码的好工具。不同的是&#xff0c;它将源代码借助浏览器展示出来&#xff0c;文件间的跳转过程成了我熟悉的点击超链…

挑战王者荣耀“绝悟” AI,我输了!

作者 | 马超责编 | 伍杏玲出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;腾讯 AI Lab 与王者荣耀联合研发的策略协作型AI&#xff0c;“绝悟”首次开放大规模开放&#xff1a;5月1日至4日&#xff0c;玩家从王者荣耀大厅入口&#xff0c;进入“挑战绝悟”测试&…

java 注解类说明

一、类中注解 SuppressWarnings ("serial"); 关键字 用途deprecation使用了不赞成使用的类或方法时的警告unchecked执行了未检查的转换时的警告&#xff0c;例如当使用集合时没有用泛型 (Generics) 来指定集合保存的类型。fallthrough当 Switch 程序块直接通往下一种…

《ArcGIS Runtime SDK for Android开发笔记》——(13)、图层扩展方式加载Google地图...

1、前言 http://mt2.google.cn/vt/lyrsm225000000&hlzh-CN&glcn&x420&y193&z9&sGalil 通过图层扩展类的方式加载Google地图的是我们通常获取Google地图的一种方式&#xff0c;根据这种方式我们可以通过拼接地图瓦片Url字符串获取瓦片数据&#xff0c;关…

调试JDK源码-一步一步看HashMap怎么Hash和扩容

调试JDK源码-一步一步看HashMap怎么Hash和扩容 调试JDK源码-ConcurrentHashMap实现原理 调试JDK源码-HashSet实现原理 调试JDK源码-调试JDK源码-Hashtable实现原理以及线程安全的原因 还是调试源码最好。 开发环境 JDK1.8NetBeans8.1 说明&#xff1a;调试HashMap的 publ…

开源一年,阿里轻量级AI推理引擎MNN 1.0.0正式发布

在经过充分的行业调研后&#xff0c;阿里淘系技术部认为当时的推理引擎如TFLite不足以满足手机淘宝这样一个亿级用户与日活的超级App。于是&#xff0c;他们从零开始自己搭建了属于阿里巴巴的推理引擎MNN。1年前&#xff0c;MNN在Github上开源&#xff0c;截止目前获得了3.9k S…

人生在成败中进步

参考文献《佛经》 人生在成败中进步佛经中有云&#xff1a;“菩萨者&#xff0c;福慧深利&#xff0c;道观双流。”“福慧双修”、“福慧双全”是众生成佛的必由之道&#xff0c;也是众生修行的理想追求。人生中&#xff0c;虽然不可能人人都能成佛&#xff0c;但是佛经有云&am…