TechEmpower Web 框架性能测试结果正式发布
TechEmpower Framework Benchmarks
基于TechEmpower的《Web Framework Benchmarks》性能基准测试的解读之后
注:带星号的项目支持完整的ORM和模板技术
一、神奇的Lithium
C++和Rust都是只提供编译期反射的,所以实现ORM的方法有两种,一种是带生成器,需要工具和预处理。一种是利用宏和模板技术来生成代码。
Lithium这个项目和其它妖艳贱货不一样,代码优雅得一塌糊涂,而且性能惊人Lithium(ORM)(RAW)以 59.2%的成绩一骑绝尘。虽然使用宏和模板有点烧脑,但还是值得一看。
对比Rust的Diesel,仅取得了24%的成绩还是有很大提升空间的。Golang的框架测试代码中没有一个带ORM,是因为Golang的反射机制还是很慢的,直接拖累了性能。
auto fortunes = sql_orm_schema(sql_db, "Fortune").fields(s::id(s::auto_increment, s::primary_key) = int(),s::message = std::string());my_api.get("/fortunes") = [&](http_request& request, http_response& response) {sql_db.max_async_connections_per_thread_ = fortunes_nconn;typedef decltype(fortunes.all_fields()) fortune;std::vector<fortune> table;{auto c = fortunes.connect(request.fiber);c.forall([&] (const auto& f) { table.emplace_back(metamap_clone(f)); });}table.emplace_back(0, "Additional fortune added at request time.");std::sort(table.begin(), table.end(),[] (const fortune& a, const fortune& b) { return a.message < b.message; });li::growing_output_buffer ss;ss << "<!DOCTYPE html><html><head><title>Fortunes</title></head><body><table><tr><th>id</th><th>message</th></tr>";for(auto& f : table){ss << "<tr><td>" << f.id << "</td><td>";escape_html_entities(ss, f.message); ss << "</td></tr>";}ss << "</table></body></html>";response.set_header("Content-Type", "text/html; charset=utf-8");response.write(ss.to_string_view());};
二、恐怖的Workerman
PHP一直热衷于各种用底层代码来提升性能,但是由于各种原因,成果有限。即使异步PHP框架swoole的出现,彻底舍弃了PHP的基本机制,使得性能有了极大提升,也没有引起大的改变,但纯PHP实现的异步框架Workerman却有可能改变这一情况。使用Workerman的Ubiquity框架竟然打败了一众框架勇夺第二名。性能提升几十倍,堪称恐怖。原来PHP已经足够优秀,只是打开方式不对。
Act(ORM)(Rythm): 28.9%
Ubiquity(ORM)(PHP):28.1%
Actix(Diesel)(HBS): 23.6%
AspCore(EF)(ASP): 23.3%
class Fortunes extends \Ubiquity\controllers\SimpleViewController {public function initialize() {\Ubiquity\cache\CacheManager::startProdFromCtrl();}public function index() {$fortunes = SDAO::getAll(Fortune::class);$fortunes[] = new Fortune(0, 'Additional fortune added at request time.');\usort($fortunes, function ($left, $right) {return $left->message <=> $right->message;});$this->loadView('Fortunes/index.php', ['fortunes' => $fortunes]);} }
三、意外的Roda
由于JavaScript使用Node.js的异步机制,使得JS框架出道即巅峰,其它脚本语言只有奋起追赶的份。此次PHP打了一个翻身仗,让JavaScript领先的局面,一下子变得落后一步。
而来自Ruby阵营的变化也让Ruby有了超过JavaScript的实力,Roda的性能在已经是Python性能一倍的基础上再翻一倍,在没有完全使用异步架构的情况下,有如此成绩,让人不禁有所期待。
脚本开发的性能排名也即将从JavaScript>Ruby>Python>>>>>>>>>PHP,变成了PHP>>>Ruby>JavaScript>Python。Python也从感觉良好一下子变成了学渣,没有了存在感。
static_get '/fortunes' do |_|@fortunes = Fortune.all@fortunes << Fortune.new(:id=>0,:message=>'Additional fortune added at request time.')@fortunes.sort_by!(&:message)view :fortunesend
附表
C++
Drogon
排名:Drogon(RAW)(CSP):100%
Drogon(MORM)(CSP):81.6%
仓库:https://github.com/an-tao/drogon
Lithium
排名:Lithium(ORM)(RAW): 59.2%
仓库:https://github.com/matt-42/lithium
Rust
Actix-web
排名:Actix(RAW)(HBS): 89.5%
Actix(Diesel)(HBS): 23.6%
仓库:https://github.com/actix/actix-web
May-minihttp
排名:May-minihttp(RAW)(Markup): 70.3%
仓库:https://github.com/Xudong-Huang/may_minihttp
Go
Atreugo
排名:Atreugo(RAW)(QuickT): 53.4%
仓库:https://github.com/savsgio/atreugo
Gofiber
排名:Gofiber(RAW)(QuickT): 44.5%
仓库:https://github.com/gofiber/fiber
iris-go
排名:(未知)
仓库:https://github.com/kataras/iris
Java
Vert.x
排名:Vert.x(RAW)(Rocker): 51.2%
仓库:https://github.com/eclipse-vertx/vert.x
Jooby
排名:Jooby(RAW)(Rocker): 46.1%
仓库:https://github.com/jooby-project/jooby
ActFramework
排名:Act(ORM)(Rythm): 28.9%
仓库:https://github.com/actframework/actframework
C#
AspCore
排名:AspCore(RAW)(ASP): 42.1%
AspCore(EF)(ASP): 23.3%
Crystal
Kemal
排名:Kemal(RAW)(ECR):30.8%
仓库:https://github.com/kemalcr/kemal
Kotlin
http4k
排名:http4k(RAW)(PEB):29.9%
仓库:https://github.com/http4k/http4k
PHP
workerman
排名:workerman(RAW)(PHP): 52.0%
kumbiaphp(RAW)(PHP):36.8%
Ubiquity(ORM)(PHP):28.1%
仓库:https://github.com/walkor/workerman
https://github.com/KumbiaPHP/KumbiaPHP
https://github.com/phpMv/ubiquity
swoole
排名:swoole(RAW)(PHP): 41.8%
ubiquity(ORM)(PHP):20.7%
Imi(ORM)(PHP):17.9%
仓库:https://github.com/swoole/swoole-src
https://github.com/phpMv/ubiquity
https://github.com/Yurunsoft/IMI
Laravel
排名:Laravel-swoole(ORM)(PHP): 3.1%
Laravel(ORM)(PHP): 0.8%
仓库:https://github.com/laravel/laravel/
Ruby
Roda
排名:Roda(sequel)(ERB): 7.5%
仓库:https://github.com/jeremyevans/roda
Sinatra
排名:Sinatra(sequel)(Slim): 5.0%
仓库:https://github.com/sinatra/sinatra
JavaScript
Nestjs
排名:Nestjs(ORM)(HBS): 10.0%
仓库:https://github.com/nestjs/nest
Koa
排名:Koa(ORM)(HBS): 6.8%
仓库:https://github.com/koajs/koa
Python
Sanic
排名:Sanic(RAW)(Jinja2): 9.6%
仓库:https://github.com/sanic-org/sanic
Django
排名:Django(ORM)(TMP): 2.2%
仓库:https://github.com/django/django
Flask
排名:Flask(RAW)(Jinja2): 3.4%
Flask(ORM)(Jinja2): 1.5%
仓库:https://github.com/pallets/flask
TechEmpower Web 框架性能测试结果正式发布相关推荐
- TechEmpower Web 框架性能第19轮测试结果正式发布,ASP.NET Core在主流框架中拔得头筹...
TechEmpower第19轮编程语言框架性能排行榜2020年5月28日正式发布,详见官方博客:https://www.techempower.com/blog/2020/05/28/framewor ...
- 使用 python web 框架 进行高并发模型上线部署 的架构 思路探索
文章大纲 web 框架性能测试 基准 sanic lstm yolo postman post 图片 sanic 服务处理 flask + gevent + gunicorn lstm yolo gr ...
- 关于node.js的web框架的应用及并发性能测试
"Node.js 是服务器端的 JavaScript 运行环境,它具有无阻塞(non-blocking)和事件驱动(event-driven)等的特色,Node.js 采用 V8 引擎,同样 ...
- Python Web框架
Bottle: Python Web框架中文文档 Bottle是一个快速,简单,轻量级的 Python WSGI Web框架.单一文件,只依赖 Python标准库 . URL映射(Routing): ...
- golang web 框架 gin beego iris 对比
1.1 框架排名 Gin 31k [Lite] Beego 22k Iris 16k Echo 15k [Lite] Revel 11k Martini 10k [×] buffalo 5k [Lit ...
- 三分钟了解 Python3 的异步 Web 框架 FastAPI
快速编码,功能完善.从启动到部署,实例详解异步 py3 框架选择 FastAPI 的原因. FastAPI 介绍 FastAPI 与其它 Python-Web 框架的区别 在 FastAPI 之前,P ...
- 「造个轮子」——cicada(轻量级 WEB 框架)
前言 俗话说 「不要重复造轮子」,关于是否有必要不再本次讨论范围. 创建这个项目的主要目的还是提升自己,看看和知名类开源项目的差距以及学习优秀的开源方式. 好了,现在着重来谈谈 cicada 这个项目 ...
- 基于sanic打造python web框架
0x00 Why 为何做这件事,在去年的一个项目中,算法同学要使用在线模型训练,不得不使用python的tf框架,这样我们不得不是python web框架,当时因为团队里面没人懂python相关的知识 ...
- 艿艿连肝了几个周末,写了一篇贼长的 Spring 响应式 Web 框架 WebFlux!市面第二完整~...
点击上方"芋道源码",选择"设为星标" 做积极的人,而不是积极废人! 源码精品专栏 原创 | Java 2020 超神之路,很肝~ 中文详细注释的开源项目 RP ...
最新文章
- 部署软件RDMA的步骤
- c++ 实例精通(1)
- 中国蚁剑的下载、安装与使用
- python 大量使用json 存储数据时,格式化输出的方式
- MarkDown语言
- java中手动装入新类到类装饰器_关于java:抽象装饰器类中的功能而不是装饰器...
- 作者:朱艳华(1982-),女,中国科学院计算机网络信息中心高级工程师
- React Native :加载新闻列表
- 深度理解cnn 网络
- Knockout.Js官网学习(创建自定义绑定)
- 【BZOJ】3396: [Usaco2009 Jan]Total flow 水流 (最大流)
- SSO之CAS单点登录实例演示
- linux脚本批量解压,Shell中使用tar命令批量解压缩的实现方法
- 微信运营:必须收藏的101条万能微信标题公式
- 请修改服务器脱机策略,异速联/天高客户端用户已离线但服务器端用户会仍话驻留处理方法...
- 最新老韩泰牛PHP基础班+大牛班+大牛班高级课程
- J2EE,J2SE,J2ME三者有什么不同?
- CNT-以太网帧和IEEE802.3帧
- 数仓(六)从0到1简单搭建数仓ODS层(埋点日志 + 业务数据)
- db的中英文全称_DB是什么?解读《北京遇上西雅图》中英语文化
热门文章
- my12306 火车票购票软件使用方法
- AngelHack2018全球黑客马拉松系列 - 上海站
- 基于 Canvas 的 HTML5 交互式地铁线路图
- Office365—>Microsoft365,4.22正式更名,新增功能有哪些?
- windows下如何进行linux编程,生产者-消费者问题编程简单实现--windows和linux下
- python word中表格字体设置_利用Python-docx 读写 Word 文档中的正文、表格、段落、字体样式等...
- 唯品会2015校园招聘技术岗附加题解答
- 输入一个数,按顺序打印这个数的每一位(C语言)
- 达梦数据库之redo日志文件损坏修复方法
- 如何关闭页面之前清空LocalStorage