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秒

时间: 2024-11-04 08:34:24

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

Python Web编程系列

我从网上找到了其他园友的文章,很不错,留着自己学习学习. Python Web编程(一)Python Web编程(二)Python Web编程(三)Python Web编程(四)Python Web编程(五)Python Web编程(六)Python Web编程(七) Python Web编程(八) 出处:http://www.cnblogs.com/game-over/category/105911.html

python+web编程学习总结记录(一)

近来一个多星期一直在学习py的web编程,从零开始,短暂时间接受的很多知识都需要消化吸收,所以在这里把这个过程梳理一遍,尽量用自己的语言去描述这些知识点. 首先是web编程的必备知识:HTTP协议.超文本传输协议(HTTP),是一种通信协议,按照定义来直接去看容易一头雾水,但其实只需要了解:web服务器和客户端之间交流,必须要遵守统一的规矩,不然就跟你说汉语我说英文一样,互相不知对方在说什么.这个统一的规矩或者格式就是HTTP协议 而服务器和客户端之间的通信方式简而言之就是,客户端给服务器发了一

python web编程-概念预热篇

互联网正在引发一场革命??不喜欢看概念的跳过,注意这里仅仅是一些从python核心编程一书的摘抄 这正是最激动人心的一部分了,web编程 Web 客户端和服务器端交互使用的“语言”,Web 交互的标准协议是HTTP(超文本传输协议).HTTP协议是TCP/IP 协议的上层协议,这意味着HTTP 协议依靠TCP/IP 协议来进行低层的交流工作.它的职责不是路由或者传递消息(TCP/IP 协议处理这些),而是通过发送.接受HTTP 消息来处理客户端的请求. HTTP 协议属于无状态协议,它不跟踪从一

python的web编程

python的web相关模块,有两种不同的类型,urlparse和urllib,分别以不同的功能和兼容性来处理URL,前者主要包括urlparse().urlunparse()和urljoin(),后者可以使用urlopen()或urlretrive()创建web客户端.urllib2模块是一个比urllib功能更加高级的模块. web开发,无疑要用到统一资源定位器URL,URL格式如下: prot_sch://net_loc/path:params?query#flag prot_sch:网路

Python 四大主流 Web 编程框架

Python 四大主流 Web 编程框架 目前Python的网络编程框架已经多达几十个,逐个学习它们显然不现实.但这些框架在系统架构和运行环境中有很多共通之处,本文带领读者学习基于Python网络框架开发的常用知识,及目前的4种主流Python网络框架:Django.Tornado.Flask.Twisted. 网络框架及MVC架构 所谓网络框架是指这样的一组Python包,它能够使开发者专注于网站应用业务逻辑的开发,而无须处理网络应用底层的协议.线程.进程等方面.这样能大大提高开发者的工作效率

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

这里就介绍几个底层的用于创建web服务器的模块,其中最为主要的就是BaseHTTPServer,很多框架和web服务器就是在他们的基础上创建的 基础知识 要建立一个Web 服务,一个基本的服务器和一个“处理器”是必备的. 基础的(Web)服务器是一个必备的模具.它的角色是在客户端和服务器端完成必要HTTP 交互.在BaseHTTPServer 模块中你可以找到一个名叫HTTPServer 的服务器基本类. 处理器是一些处理主要“Web 服务”的简单软件.它们处理客户端的请求,并返回适当的文件,静

python web编程-web客户端编程

web应用也遵循客户服务器架构 浏览器就是一个基本的web客户端,她实现两个基本功能,一个是从web服务器下载文件,另一个是渲染文件 同浏览器具有类似功能以实现简单的web客户端的模块式urllib以及urllib2(可以打开需要登录的网页)等模块 另外还有一些负载的web客户端,它不仅下载web文件,还执行其它复杂的任务,一个典型的例子就是爬虫 python实现爬虫也有一些框架模块:如Scrapy 使用python创建一个简单web客户端 你要弄清楚浏览器只是web客户端的一种,而且功能有限,

20 Web 编程 - 《Python 核心编程》

?? 引言 ?? Python 的Web 应用:简单的Web 客户端 ?? urlparse 和 urllib 模块 ?? 高级的 Web 客户端 ?? 网络爬虫/蜘蛛/机器人 ?? CGI:帮助 Web 服务器处理客户端数据 ?? 创建 CGI 应用程序 ?? 在 CGI 中使用Unicode ?? 高级 CGI ?? 创建 Web 服务器 ?? 相关模块 20.1 介绍 Web 应用:客户端/服务器计算 图20-1 因特网上的Web 客户端和Web 服务器.在因特网上客户端向服务器端发送一个

Python web编程 初识TCP UDP

Python网络编程之初识TCP,UDP 这篇文章是读了<Python核心编程>第三版(Core Python Applications)的第二章网络编程后的自我总结. 如果有不到位或者错误的地方,还请大家积极指出. 首先谈谈TCP和UDP的不同这个问题出现在很多次Python面试题中,以下答案是我根据书本来总结出的: 在谈该问题之前,我需要先简单说一下套接字的概念: 套接字是计算机网络数据结构,他体现了“通信端点的”概念.在任何类型的通信开始之前,网络应用程序必须创建套接字.可以将他们比作电