有这么一个题目:找出由数字组成的数组中最大值的索引。 (PS:不用考虑兼容性)
三个方案中,方案一最传统最直接明了,相信也是大部分人脑海里最早浮现出来的方案;方案二比方案一更简洁,使用reduce方法替换了for循环;方案三最简洁,没有循环,没有条件判断,一行代码解决问题。大部分人都喜欢追求代码简洁优雅,要是可选的话,相信很多人都会选择方案三。
但问题来了,这三个方案中哪一个性能最好呢?
方案一:性能最差,因为它需要手动去遍历数组,并且每个遍历都需要进行条件判断,所以这里的性能损耗最大;
方案二:性能较好,因为它使用了JavaScript内置的reduce函数帮我们完成了方案一中手动完成的数组遍历工作;JavaScript内置的方法肯定是比我们自己实现的要快,因此在同样需要条件判断的情况下,方案二肯定是由于方案一;
方案三:性能最好,因为相对方案二,它连条件判断都省了,使用了Math.max替代。
但实际情况真的如上面所猜测的吗?下面我们来做个测试:
测试地址:
indexOfMax-100,000 http://jsperf.com/indexofmax
indexOfMax-固原网站建设公司120,000 http://jsperf.com/indexofmax-120000
indexOfMax-130,000 http://jsperf.com/indexofmax-130000
测试结果如下:
从结果中可以看得出来,性能上:方案一最好,方案三次之,方案二最差;与上面猜测的结果完全相反。方案一最好猜测应该是浏览器JavaScript解释引擎对代码进行了优化后执行的结果,优化后的代码从底层实现上来看应该是比reduce、indexOf、Math.max等底层接口的性能更好,因此效率更高。
同时注意到,在Chrome下,当数组长度达到130,000时浏览器抛出了最大调用堆栈的异常,我此前说过,浏览器对调用堆栈的大小是有限制的。不同浏览器对函公司网站建设数最大参数长度的限制是不一样的,所以这里需要注意下。
高级浏览器的表现似乎比较统一,那么IE的表现又怎么样呢?
IE下测试结果如下:
由于IE10、IE11越发往标准浏览器靠拢,他们的表现跟IE9宿迁网站建设公司不同,倒与Chrome、Firefox有点类似,也是方案一最快,但是方案三最慢。这可能跟每个浏览器自身的实现以及内部优化有关系。
So,做性能优化时的几点建议:
内置的函数不一定是效率最好的,最简洁优雅的写法不一定可以带来性能上的提升;
JavaScript虽然是解释型语言,但并不代表所做的操作越少性能越好;
要考虑不同平台以及浏览器对接口的性能差异,按需权衡;
尽可能保持简单的思考方式,不要过度设计,当发现性能问题时再尝试去寻找解决方案;
性能优化需要数据支持,不能盲目相信经验或者固有认知。
南京牧狼文化传媒有限公司简介:
牧狼传媒,牧者之心,狼者之性,以牧之谦卑宽容之心待人,以狼之团结无畏之性做事!
公司注册资金100万,主营众筹全案服务、网站营销全案服务、网站建设、微信小程序开发、电商网店设计、H5页面设计、腾讯社交广告投放以及电商营销推广全案等相关业务,致力于为客户提供更有价值的服务,创造让用户满意的效果!
为百度官方及其大客户、苏宁易购、金山WPS秀堂、美的、创维家电、新东方在线、伊莱克斯、宝丽莱等国内国外知名品牌服务过,服务经验丰富!同时,公司也是南京电子商务协会会员单位、猪八戒网官方认证签约服务商、江苏八戒服务网联盟、南京浦口文化产业联合会会员单位,可以为您提供更好的服务!
主营项目:众筹全案服务、网站营销全案服务、网站建设、微信小程序开发、电商网店设计、H5页面设计、腾讯社交广告投放、竞价托管、网站优化、电商代运营等
合作客户:百度、苏宁易购、饿了么、美的、创维家电、新东方在线、宝丽莱、金山WPS秀堂、伊莱克斯
资质荣誉:百度商业服务市场2017年度最佳图片服务商、南京电子商务协会会员单位、猪八戒网官方认证签约服务商、江苏八戒服务网联盟、南京浦口文化产业联合会会员单位、八戒通TOP服务商、"易拍即合杯"H5创意大赛"三等奖"。