OneAPM大讲堂 | 谁更快?JavaScript 框架性能评测
文章系国内领先的 ITOM 管理平台供应商 OneAPM 编译呈现。
网页性能是一个丰富且又复杂的话题。在本帖中,我们会将讨论的范围局限在前端 JavaScript 框架上,探究相对于另外一种框架而言,使用当前的框架会如何影响您的应用程序的性能。我们会特别关注两点:
(1)某种框架要使用多长的时间来更新用户界面
(2)为了让框架正常工作,下载和解析所需要的软件包所花费的时间
在过去几年中,我所使用的这些数据一直来源于 Stefan Krause 的 js-framework-benchmark。资源很好,但也有点复杂了。仅关注部分结果应该会更简单一些,而本文中我们也正是这样做的。建议您看看 Stefan 所构建的工具,自己先深入了解一下这些数据,尤其是如果下面的图片中没有你最钟意的框架的话。这些资源可以从 Stefan 的网站上获取(他已测试过 40 多个框架)。
另外需要注意的是:
这些只是初步的统计结果,使用时需谨慎(比如,它们可能来自不同的浏览器版本)。
请留意这个问题。
窥探数字
第一组要关注的结果是每一种框架需要多长的时间在一个大型表格上进行各种操作,例如创建行,删除行等等。重要的一点是,这些是有键框架的数据结果。以下是来自 Stefan 站点的解释:
有键的实现通过设定键值在域数据和 dom 元素之间创建了某种关联。如果数据变更了,与该键关联的 dom 元素也会被更新。因此,往数据列表里增添或删除元素会导致 dom 发生相应的变化。
在下图中,越大的数字表示框架执行任务越慢。表格底部的“减速几何平均“是一项总的性能指标,从左至右,依次表明了各个框架的评级。最左端是 vanillajs ,表示无框架的实现,做为一个参考点。

如您所见,这里我囊括了大部分流行的前端框架,以及一些不太有名,但是非常有趣的框架。 Preact (一个非常流行的框架)和 Inferno 具有与 React 非常类似的应用编程接口(API),所 以我也将他们包含了进来。如果你的团队正在使用 React 搭建对性能要求很高的应用,那他们或许是不错的选择。另外要注意的是,有键框架得出的结果通常会比较慢一些,因为框架要完成更多的任务。
在这些最流行的框架中,Vue 看起来相当出色。Angular 和 React 都是显著偏慢的框架,两者给出的性能数据也相差无几。Inferno 的库是其中的佼佼者。作为题外话,Inferno 的作者 Dominic Gannaway 新近被 Facebook 聘用,参与到 React 团队中。
现在来看一些无键框架的统计结果:

需要注意几点。首先,这里列出的框架数量要少一些,因为并非每一种框架都有无键的结果。最快的要数 Svelte,这种框架很有趣,采用不同的方式实现,你也应该对其一探究竟。
在开始后续的话题之前,如果不提一提高居榜首的 Surplus (由 Adam Haile 开发),那未免显得有些失职。它在有键和无键的测试结果中都脱颖而出。另外,还有其他一些表现优异的框架包括 petit-dom 和 dio ,我没有将它们列在上面是因为我想用更多的篇幅讨论最受欢迎的那些库和框架。如果你查看结果统计表,你很快会被这庞大的统计数据搞得沉重不堪。因此对其做一些修正,让事情变得可控,以更好地达到我们的目的。
启动指标
之前的结果关注完全加载页面以及在大型表格上执行操作时框架的执行速度。下面的一组数据则是从另一个不同的视角来衡量框架的性能——下载,解析和编译所耗费的时间。
这些统计值可以告诉我们,用户需要等待多长的时间后加载的页面才能开始正常工作。通常来讲,要下载的 JavaScript 越多,浏览器需要解析和编译的代码量越大,所需要的时间就越长。
同样的,这些统计结果也是分为有键的和无键的。我们先来看看有键的统计结果:

这些用于评级的指标值并不能很方便地说明问题,但通常而言,绿色代表较好,红色代表逊色。同样地, Inferno 表现优异,Svelte 和 Preact 也相当出色。在这些最受欢迎的框架中,Vue 表现最好,而 Ember 则垫底榜单,落后于其他的对手。
现在来看看无键的统计结果:

在这一组中,Svelte 表现得非常快速且轻量级。其 total byte weight 值甚至比纯 vanilla JavaScript 还低。我告诉过你,这是一种非常有趣的框架,没错吧!
后续思考
一个月前,在读了 Addy Osmani 所著的 The Cost of JavaScript 一书后,我脑海里便萌生了撰写该文的念头。他分享的一张图表给了我启示。该图展示了在不同的移动设备上,一个 250KB 用 gzip 压缩的(未解压缩时为 1MB ) JavaScript 包需要花费多长时间完成解析。图中特别标出了平均设备的统计值,如下所示:

前端的 JavaScript 框架是一项引人关注的工程技术。它们很复杂,且不容易做好。针对特定的项目使用哪一种框架常常也很难抉择,其中有许多需要权衡的因素。例如,像 React 这样的框架具有一个大型的生态系统,通过提供许多第三方的库和丰富的培训资料,以及其他一些优势,可以加速你的项目进度。但如果你的项目是针对 2G 网络用户的,React 还会是最佳的选择吗?答案也许是否定的。
判断哪一种框架会工作得最好最终都取决于项目需求,以及构建项目的团队。希望本文所展示的结果能够给读者的思考带来一些源泉。
Browser Insight 是一个基于真实用户的 Web 前端性能监控平台,能够帮大家定位网站性能瓶颈,网站加速效果可视化;支持浏览器、微信、App 浏览 HTML 和 HTML5 页面。想阅读更多技术文章,请访问 OneAPM 官方技术博客。
来源:http://blog.oneapm.com/apm-tech/806.html
OneAPM大讲堂 | 谁更快?JavaScript 框架性能评测的更多相关文章
- 主流PHP框架性能评测 (引用)
主要涉及到的框架有 CodeIgniter 老品牌易用性框架yaf 鸟哥用c写的php扩展,高性能框架yii 自动生成代码(gii)laravel 号称最优雅的框架swoole framework 支 ...
- TechEmpower 21轮Web框架 性能评测 -- C# 的性能 和 Rust、C++并驾齐驱
自从2021年2月第20轮公布的测试以后,一年半后 的2022年7月19日 发布了 TechEmpower 21轮测试报告:Round 21 results - TechEmpower Framewo ...
- 开源RPC(gRPC/Thrift)框架性能评测
海量互联网业务系统只能依赖分布式架构来解决,而分布式开发的基石则是RPC:本文主要针对两个开源的RPC框架(gRPC. Apache Thrift),以及配合GoLang.C++两个开发语言进行性能对 ...
- TensorRT 3:更快的TensorFlow推理和Volta支持
TensorRT 3:更快的TensorFlow推理和Volta支持 TensorRT 3: Faster TensorFlow Inference and Volta Support 英伟达Tens ...
- OneAPM大讲堂 | 提高JavaScript性能的30个技巧
文章系国内领先的 ITOM 管理平台供应商 OneAPM 编译呈现. 您是网站管理员还是网页开发人员?想创建超快速的网站吗? 今天我们来看看 JavaScript,这项神奇而又复杂的技术.它使网站内容 ...
- Quick UDP Internet Connections 让互联网更快的协议,QUIC在腾讯的实践及性能优化
https://mp.weixin.qq.com/s/44ysXnVBUq_nJByMyX9n5A 让互联网更快:通往QUIC之路 原创: 史天 翻译 云技术实践 8月15日 QUIC(Quick U ...
- 更轻更快的Vue.js 2.0与其他框架对比(转)
更轻更快的Vue.js 2.0 崭露头角的JavaScript框架Vue.js 2.0版本已经发布,在狂热的JavaScript世界里带来了让人耳目一新的变化. Vue创建者尤雨溪称,Vue 2.0 ...
- 更快学习 JavaScript 的 6 个思维技巧
更快学习 JavaScript 的 6 个思维技巧 我们在学习JavaScript,或其他任何编码技能的时候,往往是因为这些拦路虎而裹足不前: 有些概念可能会造成混淆,尤其当你是从其他语言转过来的时候 ...
- 让DB2跑得更快——DB2内部解析与性能优化
让DB2跑得更快——DB2内部解析与性能优化 (DB2数据库领域的精彩强音,DB2技巧精髓的热心分享,资深数据库专家牛新庄.干毅民.成孜论.唐志刚联袂推荐!) 洪烨著 2013年10月出版 定价:7 ...
随机推荐
- Testing - 软件测试知识梳理 - 测试阶段
估算 测试对软件工作量的估算的准确性 测试评估软件系统的状况的准确性 关注点: 不准确的估算 不适当的开发过程 不真实的状态报告 如何知道对工作量的估算是正确的 估算工作量的工具很容易出错 对软件工作 ...
- JSTL-简介
JSTL全称为 JSP Standard Tag Library 即JSP标准标签库. JSTL作为最基本的标签库,提供了一系列的JSP标签,实现了基本的功能:集合的遍历.数据的输出.字符串的处理.数 ...
- vue-cli3 DllPlugin 提取公用库
vue 开发过程中,保存一次就会编译一次,如果能够减少编译的时间,哪怕是一丁点,也能节省不少时间.开发过程中个人编写的源文件才会频繁变动,而一些库文件我们一般是不会去改动的.如果能把这些库文件提取出来 ...
- laravel5实现第三方登录(微信)
背景 最近手头一个项目需要实现用户在网站的第三方登录(微信和微博),后端框架laravel5.4. 实现过程以微信网页版第三方登录,其他于此类似,在此不做重复. 准备工作 网站应用微信登录是基于OAu ...
- SQL分别求行、列的平均值
日常工作中,会需要用SQL求平均值,分别是求某一项的平均值或求某一个对象的平均值,放到表格就是求一行中的几个字段的平均值和求一列的平均值. 第一种:[列的平均值]AVG:这个函数相信大家都不陌生的,求 ...
- python之内置装饰器(property/staticmethod/classmethod)
python内置了property.staticmethod.classmethod三个装饰器,有时候我们也会用到,这里简单说明下 1.property 作用:顾名思义把函数装饰成属性 一般我们调用类 ...
- Xamarin.Android 调用本地相册
调用本地相册选中照片在ImageView上显示 代码: using System; using System.Collections.Generic; using System.Linq; using ...
- 持续集成工具-Jenkins 使用介绍
Jenkins 是一个可扩展的持续集成引擎,可以为我们提供代码自动编译.打包和发布工作,减少部署成本. 一.安装与启动 Jenkins 提供了多种便捷的安装方式,比较推荐使用执行 war 包的方式. ...
- Linux编程 6 (查看进程 ps 及输出风格)
一.查看进程命令ps 1.1 默认ps 命令 在默认情况下,ps命令只会显示运行在当前控制台下,属于当前用户的进程,在上图中,我们只运行了bash shell以及ps命令本身. 上图中显示了程序的进程 ...
- Android生成二维码--保存和分享二维码图片
之前写过生成自定义二维码的两篇文章:<Android生成自定义二维码><Android生成二维码–拍照或从相册选取图片>,下面就介绍一下Android应用内如何保存以及分享二维 ...