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就稍微慢一些。

web编程速度大比拼(nodejs go python)(非专业对比)的更多相关文章

  1. python笔记之编程风格大比拼

    python笔记之编程风格大比拼 虽然我的python age并不高,但我仍然愿意将我遇到的或者我写的有趣的python程序和大家一块分享,下面是我找到的一篇关于各类python程序员的编程风格的比较 ...

  2. python web编程-概念预热篇

    互联网正在引发一场革命??不喜欢看概念的跳过,注意这里仅仅是一些从python核心编程一书的摘抄 这正是最激动人心的一部分了,web编程 Web 客户端和服务器端交互使用的“语言”,Web 交互的标准 ...

  3. Python 四大主流 Web 编程框架

    Python 四大主流 Web 编程框架 目前Python的网络编程框架已经多达几十个,逐个学习它们显然不现实.但这些框架在系统架构和运行环境中有很多共通之处,本文带领读者学习基于Python网络框架 ...

  4. 系列文章--Python Web编程

    我从网上找到了其他园友的文章,很不错,留着自己学习学习. Python Web编程(一)Python Web编程(二)Python Web编程(三)Python Web编程(四)Python Web编 ...

  5. python web编程 创建一个web服务器

    这里就介绍几个底层的用于创建web服务器的模块,其中最为主要的就是BaseHTTPServer,很多框架和web服务器就是在他们的基础上创建的 基础知识 要建立一个Web 服务,一个基本的服务器和一个 ...

  6. python web编程-web客户端编程

    web应用也遵循客户服务器架构 浏览器就是一个基本的web客户端,她实现两个基本功能,一个是从web服务器下载文件,另一个是渲染文件 同浏览器具有类似功能以实现简单的web客户端的模块式urllib以 ...

  7. python 教程 第十八章、 Web编程

    第十八章. Web编程 import urllib2 LOGIN = 'jin' PASSWD = 'Welcome' URL = 'https://tlv-tools-qc:8443/qcbin/s ...

  8. Python web编程 初识TCP UDP

    Python网络编程之初识TCP,UDP 这篇文章是读了<Python核心编程>第三版(Core Python Applications)的第二章网络编程后的自我总结. 如果有不到位或者错 ...

  9. Django,Flask,Tornado三大框架对比,Python几种主流框架,13个Python web框架比较,2018年Python web五大主流框架

    Django 与 Tornado 各自的优缺点Django优点: 大和全(重量级框架)自带orm,template,view 需要的功能也可以去找第三方的app注重高效开发全自动化的管理后台(只需要使 ...

随机推荐

  1. hive 配置MySQL库

    chkconfig mysqld on MySQL开机自启动 建库: --hive数据库2create database hive DEFAULT CHARSET utf8 COLLATE utf8_ ...

  2. 网络分析shell脚本(实时流量+连接统计)

    介绍一个强大的分析网络的shell脚本,此脚本是从EZHTTP拆分出来的,觉得有必要单独介绍下.脚本运行效果截图: 此脚本包含的功能有: 1.实时监控任意网卡的流量 2.统计10秒内平均流量 3.统计 ...

  3. & 和 && 区别

    java中&和&&的区别,&和&&虽然都是逻辑运算符,都是判断两边为真,则语句成立,但是在运行的时候,还是有差别的,下面举例来说明. java中& ...

  4. python two-dimensional array assignment initialize

    #if you want to initialize a 9*9 two-dimensional array [([""]*9) for i in range(9)] #cauti ...

  5. Centos6.7 安装ReviewBoard2.5.7 问题记录

    pip install ReviewBoard 1.修改pip源,默认源网络不畅 pip install -i http://pypi.douban.com/simple simplejson 2.p ...

  6. Android 常用代码片小结

    1. dp px 相互转换---------------public class DensityUtil { /** * 根据手机的分辨率从 dip 的单位 转成为 px(像素) */ public ...

  7. avalon.js实践 svg地图配置工具

    MVVM模式,在很多复杂交互逻辑下面,有很大的优势.现在相关的框架也很多,现在项目中使用了avalon.js,选择它的原因,是兼容性的考虑,当然也要支持下国内开发大牛,至于性能方面的,没有实际测试过, ...

  8. java.util.Random 类的 nextInt(int num )

    随机产生3个67~295的整数并找出数值居中的数 并输出中间的数例如:100,225和200,输出200 要随机产生某个范围内的整数,用 java.util.Random 类的 nextInt(int ...

  9. PHP静态成员变量和非静态成员变量

    数据成员可以分静态变量.非静态变量两种. 静态成员: 静态类中的成员加入static修饰符,即是静态成员.可以直接使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静态成员需要实例化才会 ...

  10. Android学习笔记27:网格视图GridView的使用

    网格视图GridView的排列方式与矩阵类似,当屏幕上有很多元素(文字.图片或其他元素)需要按矩阵格式进行显示时,就可以使用GridView控件来实现. 本文将以一个具体的实例来说明如何使用GridV ...