热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

reactaomini(第三弹),赢在小巧,性能方面,干翻reactredux还是可以的

到目前为止,react-aomini最大的特点就是简单粗暴(react-aomini是个人写的一个谈不上框架的小框架,不了解的可以看看我之

到目前为止,react-aomini最大的特点就是简单粗暴(react-aomini是个人写的一个谈不上框架的小框架,不了解的可以看看我之前写的两篇博文,react-redux?mobx?或许我需要更加小巧玲珑的和小巧玲珑的react框架(第二弹)正式命名--aomini),大家感兴趣的可以从react-aomini github签出代码看看,代码写的也没拾掇过,见笑见笑,看个思路,简单轻量是实现了,但是大家还是会疑惑,那真的能投入实战吗,性能到底咋样呢?实不相瞒,我个人也是比较好奇,毕竟我也没有测试过,不过我还是蛮有信心的,因为轻量就是不为求全,只为解决最尖锐的那个问题,所以最接近原生,原生肯定比在外面套层外套跑的快啦,所以相信react-aomini不会太挫,不过说是这么说,还是要数据来说话。 为了结果更加有参考意义,我们就拿当下最流行的react-redux框架来进行性能对比,react-aomini和react-redux作为实验组,并加入react原生作为参照组。我们的性能测试对比主要是采用控制三个不同的框架作为唯一变量进行实验,三个实验对象中对同一个模块进行相同数量级的调用,分别记录耗时数据。 接下来简要说明一下我们的实验,我们会对每个实验体(也就是react-aomini,react和react-redux)分别进行百级、千级、万级以及十万级的模块加载,然后分别对所有模块进行更新操作,模块加载暂不作为统计数据,我们取更新操作的耗时作为实验数据,每组取十个数据作为一组。为了方便起见,我使用其中最简单的react原生代码进行实验说明,代码如下: Module1.js

class Module1 extends React.Component{constructor(){super();this.state = {moduleQuantity:900};}render(){let { moduleQuantity } = this.props;return (

--------Module1---------

type="number" value={moduleQuantity} onChange={this.setValue.bind(this)} />
)}componentDidUpdate(prevProps, prevState) {console.log("Module1 did update")}setValue(e){console.log(e.target.value);let { setModuleQuantity } = this.props;setModuleQuantity(e.target.value);}
}

MoudleX.js代码如下:

/**
* siblings2
*/
class ModuleX extends React.Component{constructor(){super();this.startTime = 0;this.state = {updateCount:1};}render(){let {moduleQuantity} = this.props;let { updateCount } = this.state;console.log("&&&&&&&&&&&",updateCount)let subNum = Number(moduleQuantity || 0);return (

---------ModuleX---------

兄弟节点Module1的值:{moduleQuantity}{subNum <&#61; 0 ? "":(Array(subNum).fill(1).map((item,i)&#61;>{return ()}))}
)}componentWillUpdate(nextProps, nextState) {this.startTime &#61; new Date().getTime();console.log("ModuleX will update")}componentDidUpdate(prevProps, prevState) {console.log("ModuleX did update using time:",new Date().getTime() - this.startTime)}updateX(){let { updateCount } &#61; this.state;this.setState({updateCount:updateCount&#43;1});}
}

最重要的一个实验模块SubModuleX代码如下&#xff1a;

class SubModuleX extends React.Component{constructor(props) {super(props);this.state &#61; {};}render() {let { mIndex, updateCount } &#61; this.props;return

sub module {mIndex},update count:{updateCount}
}
}

App.js文件如下&#xff1a;

class App extends React.Component{constructor(){super();this.name &#61; "App";this.state &#61; {moduleQuantity:900}}render(){let {moduleQuantity} &#61; this.state;console.log("moduleQuantity:",moduleQuantity)return (

setModuleQuantity&#61;{this.setModuleQuantity.bind(this)} />
)}setModuleQuantity(moduleQuantity){this.setState({moduleQuantity})}
}

实验代码如上简要说明一下&#xff0c;十分简单。其中Module1模块主要是一个moduleQuantity的输入框&#xff0c;也就是控制实验数量的一个输入&#xff0c;ModuleX模块中获取moduleQuantity后&#xff0c;对SubModuleX进行循环装载&#xff0c;模块加载完后&#xff0c;才算是准备好进行实验&#xff0c;这里注意&#xff0c;我们并没有将模块的加载耗时作为实验数据&#xff0c;而是将更新模块耗时作为实验数据。 为了数据更具有参考意义&#xff0c;这里贴一下我实验环境参数&#xff1a;mac pro&#xff0c;单核 i7处理器2.4GHz&#xff0c;8G内存&#xff0c;google浏览器最新版本61.0.3163.100。 开始我们的实验后&#xff0c;我们只需要点击ModuleX中的更新按钮&#xff0c;所有模块更新完毕后&#xff0c;会打印出每次的耗时。我们将实验结果记录并绘成折线图&#xff0c;结果如下&#xff1a;

以上结果可以看出&#xff0c;在千级模块调用内&#xff0c;耗时几乎都在100毫秒内&#xff0c;差距并不大&#xff0c;在实际开发中感受必定不明显&#xff0c;但是已经一目了然。随着数量级的增大&#xff0c;到了万级的模块调用&#xff0c;性能明显进一步拉大&#xff0c;react均值在450ms&#xff0c;react-aomini的均值在600ms&#xff0c;而react-redux在800ms上下。此后&#xff0c;数量级规模越大&#xff0c;差距拉开也加大&#xff0c;十万级调用中&#xff0c;react-redux均值在13s以上&#xff0c;比react-aomini耗时多出将近6s。 从以上实验结果可以得出&#xff0c;react原生是最快的&#xff0c;而披上了一件毛皮大衣的react-redux意料之中垫了底&#xff0c;react-aomini披上一件小背心轻装上阵&#xff0c;性能还是可喜的。 所以以上可以得出两个结论&#xff1a; 1、react-aomini性能没有问题&#xff0c;可以放心投入生产&#xff1b; 2、毕竟十万级的模块数量的大工程本来已经不多了&#xff0c;况且是同时对所有模块进行更新就更加不可能了&#xff0c;所以react-redux即使披了件大外衣很重&#xff0c;但并没有太影响它的机能&#xff0c;所以选用哪个框架&#xff0c;性能问题可以不用过多关注啦。 实验结果摆在这了&#xff0c;秒杀react-redux&#xff0c;react-aomini还是没有问题滴&#xff0c;毕竟小巧玲珑还是有一定优势的。 不过作为开发者不能盲目吹嘘&#xff0c;这个项目不是为了跟react-redux进行pk而生的&#xff0c;是为了解决react-redux开发路径过长的问题&#xff0c;适用于微小型的项目&#xff0c;这个设计初衷只是便于状态的管理&#xff0c;为了保持微小项目的灵活性和开发便捷性&#xff0c;大型项目还是不太适用的&#xff0c;容易造成代码的不清晰。 好了&#xff0c;代码会进行持续优化&#xff0c;感兴趣的话就持续关注吧。


推荐阅读
  • vue使用
    关键词: ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • FeatureRequestIsyourfeaturerequestrelatedtoaproblem?Please ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • 深入理解CSS中的margin属性及其应用场景
    本文主要介绍了CSS中的margin属性及其应用场景,包括垂直外边距合并、padding的使用时机、行内替换元素与费替换元素的区别、margin的基线、盒子的物理大小、显示大小、逻辑大小等知识点。通过深入理解这些概念,读者可以更好地掌握margin的用法和原理。同时,文中提供了一些相关的文档和规范供读者参考。 ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • React项目中运用React技巧解决实际问题的总结
    本文总结了在React项目中如何运用React技巧解决一些实际问题,包括取消请求和页面卸载的关联,利用useEffect和AbortController等技术实现请求的取消。文章中的代码是简化后的例子,但思想是相通的。 ... [详细]
  • 在JavaScript中,函数没有重载的概念,如果声明了多个重名的函数,不管函数的形参个数是否一样,只有最后一个有效。如果调用函数时传入的参数个数与函数定义时的参数个数不符,会出现不同的情况。函数调用时,传入的参数个数少于函数定义时的参数个数,未传入的参数会被当做undefined处理,可能会导致错误。而传入的参数个数多于函数定义时的参数个数,多余的参数不会被使用,但不会报错。 ... [详细]
  • React基础篇一 - JSX语法扩展与使用
    本文介绍了React基础篇一中的JSX语法扩展与使用。JSX是一种JavaScript的语法扩展,用于描述React中的用户界面。文章详细介绍了在JSX中使用表达式的方法,并给出了一个示例代码。最后,提到了JSX在编译后会被转化为普通的JavaScript对象。 ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
author-avatar
知书达理小姐linda
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有