Linkedin工程师是如何优化他们的Java代码的-Java开发Java经验技巧

Linkedin工程师是如何优化他们的Java代码的-Java开发Java经验技巧

ID:41776038

大小:52.87 KB

页数:6页

时间:2019-09-02

Linkedin工程师是如何优化他们的Java代码的-Java开发Java经验技巧_第1页
Linkedin工程师是如何优化他们的Java代码的-Java开发Java经验技巧_第2页
Linkedin工程师是如何优化他们的Java代码的-Java开发Java经验技巧_第3页
Linkedin工程师是如何优化他们的Java代码的-Java开发Java经验技巧_第4页
Linkedin工程师是如何优化他们的Java代码的-Java开发Java经验技巧_第5页
资源描述:

《Linkedin工程师是如何优化他们的Java代码的-Java开发Java经验技巧》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、LinkcdinJ.程师是如何优化他们的Java代码的-编程开发技术Linkedin工程师是如何优化他们的Java代码的译文出处:android原文出处:Linkedin技术博客最近在刷各大公司的技术博客的时候,我在Linkedin的技术博客上而发现了一篇很不错I■専文。这篇I■専文介绍了Linkedin信息流中间层FeedMixer,它为Linkedin的Web主页,大学主页,公司主页以及客户端等多个分发渠道提供支撑(如下图所示)。在FeedMixer里面用到了一个叫做SPR(念“superv)的库。博文讲的就是如何优化SPR的java代码。下面就是他们总结的优化经验。

2、1•谨慎对待Java的循环遍历Java屮的列表遍历可比它看起来要麻烦多了。就以下面两段代码为例:•A:privatefinalListbars;for(Barbar:bars){//Doimportantstuff}•B:privatefinalListbars;for(inti=0;i<_bars.size();i++){Barbar=bars.get(i);//Doimportantstuff代码A执行的时候?会为这个抽象列表创建一个迭代器,而代码B就直接使用?get(i)?来获取元索,相对于代码A省去了迭代器的开销。实际上这里还是需要一些权衡的。

3、代码A使用了迭代器,保证了在获取元素的时候的吋间复杂度是?0仃)?(使用了?getNextO?和?hasNextO?方法),最终的吋间复杂度为?0(n)?。但是对于代码B,循环里每次在调用?_bars.get(i)?的吋候花费的时间复杂度为?0(n)??(假设这个list为一个LinkcdList),那么最终代码B整个循环的时间复杂度就是?0(『2)?(但如果代码B里而的list是?ArrayList,?那?get(i)?方法的时间复杂度就是?0(1)了)。所以在决定使用哪一种遍历的方式的吋候,我们需要考虑列表的底层实现,列表的平均长度以及所使用的内存。最后因为我们需要优

4、化内存,再加上?ArmyList?在大多数情况下杳找的时间复杂度为?0(1)?,最后决定选择代码B所使用的方法。2.在初始化的时候预估集合的大小从Java的这篇?文档我们可以了解到:?“一个HashMap实例有曲个影响它性能的因索:初始大小和加载因子(loadfactor)o[…]当哈希表的大小达到初始人小和加载因子的乘积的时候,哈希表会进行rehash操作[…]如果在一个HashMap实例里面要存储多个映射关系时,我们需要设置足够大的初始化大小以便更有效地存储映射关系而不是让哈希表自动增长让后rehash,造成性能瓶颈。”在Linkedin实践的吋候,常常碰到需要遍历一

5、个?ArrayList?并将这些元素保存至lJ?HashMap?里面去。将这个?HashMap?初始化预期的人小可以避免再次哈希所带来的开销。初始化大小可以设置为输入的数组大小除以默认加载因了的结果值(这里取0.7):•优化前的代码:HashMap_map;voidaddObjects(Listinput){_map=newHashMap();for(Foof:input)_map.put(f.getldO,f);HashMapmap;voidaddObjects(Listinpu

6、t){_map=newIlashMap((int)Math.ceil(input.size()/0.7));for(Foof:input){_map.put(f.getld(),f);r}2.延迟表达式的计算在Java中,所有的方法参数会在方法调用之前,只要有方法参数是一个表达式的都会先这个表达式进行计算(从左到右)。这个规则会导致一些不必要的操作。考虑到下面一个场景:使用ComparisonChain比较两个?Foo?对象。使用这样的比较链条的一个好处就是在比较的过程中只要一个comparcTo方法返回了一个非零值整个比较就结束了,避免了许多无谓

7、的比较。例如现在这个场景屮的要比较的对彖最先考虑他们的score,然后是position,最后就是?_bar?这个属性T:publicclassFoo{privatefloatscore;privateint_position;privateBar_bar;9publicintcompareTo(Fooother){returnComparisonChain.start().compare(score,other.getScore()).compare(_position,other.getPosition()).compar

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。