设为首页 收藏本站
查看: 1088|回复: 0

[经验分享] web编程速度大比拼(nodejs go python)(非专业对比)

[复制链接]

尚未签到

发表于 2017-2-24 09:40:53 | 显示全部楼层 |阅读模式
  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的测试:
  
package main
import (
         "fmt"
         "net/http"
)
func sayhelloName(w http.ResponseWriter, r *http.Request){
         fmt.Fprintf(w, "hello world!")
}
func main() {
         http.HandleFunc("/", sayhelloName)
         http.ListenAndServe(":9090", nil)
}
  连续测试5次,成绩大体如下:



Transactions:                  10000 hits
Availability:                 100.00 %
Elapsed time:                   4.11 secs
Data transferred:               0.11 MB
Response time:                  0.03 secs
Transaction rate:            2433.09 trans/sec
Throughput:                     0.03 MB/sec
Concurrency:                   79.76
Successful transactions:       10000
Failed transactions:               0
Longest transaction:            0.20
Shortest transaction:           0.00
  4.11秒,不错的成绩
  再看NodeJS的例子:



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

  测试结果如下:



Transactions:                  10000 hits
Availability:                 100.00 %
Elapsed time:                   5.00 secs
Data transferred:               0.11 MB
Response time:                  0.04 secs
Transaction rate:            2000.00 trans/sec
Throughput:                     0.02 MB/sec
Concurrency:                   86.84
Successful transactions:       10000
Failed transactions:               0
Longest transaction:            0.17
Shortest transaction:           0.00
  5秒,比Go稍微慢一点
  接下来是Python,由于python自带的wsgiref服务器,只是一个参考实现,性能很差,所以这里选用了两个性能不错的WSGI服务器gevent、tornado
  gevent代码如下:



#!/usr/bin/python
from gevent import pywsgi
def hello_world(env, start_response):
     if env['PATH_INFO'] == '/':
         start_response('200 OK', [('Content-Type', 'text/html')])
         return ["hello world"]
print 'Serving on https://127.0.0.1:8000'
server = pywsgi.WSGIServer(('0.0.0.0', 8000), hello_world )
server.serve_forever()

  tornado的代码如下:



from tornado import httpserver
from tornado import ioloop
def handle_request(request):
     if request.uri=='/':
         message = b"Hello World!"
         request.write(b"HTTP/1.1 200 OK\r\nContent-Length: %d\r\n\r\n%s" % (
                  len(message), message))
         request.finish()
http_server = httpserver.HTTPServer(handle_request)
http_server.bind(8888)
http_server.start()
ioloop.IOLoop.instance().start()

  由于python的例子要分别在python2 python3 pypy下跑,结果太多,我这里只给结果:
  gevent:
  python2:5.8秒,python3:7.5秒,pypy:4.8秒
  有意思的是:pypy第一次跑用了6.8秒,第二次以后全是4.8秒(感觉原因是第一次由于jit浪费了一点时间)贴出某次pypy的成绩:



Transactions:                  10000 hits
Availability:                 100.00 %
Elapsed time:                   4.77 secs
Data transferred:               0.10 MB
Response time:                  0.04 secs
Transaction rate:            2096.44 trans/sec
Throughput:                     0.02 MB/sec
Concurrency:                   90.38
Successful transactions:       10000
Failed transactions:               0
Longest transaction:            0.13
Shortest transaction:           0.00

  接下来是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



package main
import "github.com/codegangsta/martini"
func main() {
   m := martini.Classic()
   m.Get("/", func() string {
     return "Hello world!"
   })
   m.Run()
}

  运行时间为:



Transactions:                  10000 hits
Availability:                 100.00 %
Elapsed time:                   4.69 secs
Data transferred:               0.11 MB
Response time:                  0.04 secs
Transaction rate:            2132.20 trans/sec
Throughput:                     0.02 MB/sec
Concurrency:                   90.23
Successful transactions:       10000
Failed transactions:               0
Longest transaction:            0.17
Shortest transaction:           0.00

  nodejs+express:



var express = require('express')
var app = express()
app.get('/', function (req, res) {
   res.send('Hello World')
})
app.listen(3000)
  用时:



Transactions:                  10000 hits
Availability:                 100.00 %
Elapsed time:                   5.90 secs
Data transferred:               0.10 MB
Response time:                  0.06 secs
Transaction rate:            1694.92 trans/sec
Throughput:                     0.02 MB/sec
Concurrency:                   96.44
Successful transactions:       10000
Failed transactions:               0
Longest transaction:            0.13
Shortest transaction:           0.01

  python gevent+bottle:



from gevent import monkey
monkey.patch_all()
from bottle import run,get
@get("/")
def index():
     return "Hello world!"
run(server='gevent')

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



import tornado.httpserver
import tornado.ioloop
import tornado.web
class IndexHandler(tornado.web.RequestHandler):
     def get(self):
         self.write('Hello World!')
if __name__ == "__main__":
     app = tornado.web.Application(handlers=[(r"/",IndexHandler)])
     http_server = tornado.httpserver.HTTPServer(app)
     http_server.listen(8000)
     tornado.ioloop.IOLoop.instance().start()

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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-346452-1-1.html 上篇帖子: NodeJs 开发微信公众号(三)微信事件交互 下篇帖子: nodejs环境使用jshint
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表