国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Linkedin 工程師如何優化他們的 Java 代碼

開發 后端
最近在刷各大公司的技術博客的時候,我在Linkedin的技術博客上面發現了一篇很不錯博文。這篇博文介紹了Linkedin信息流中間層Feed Mixer,它為Linkedin的Web主頁,大學主頁,公司主頁以及客戶端等多個分發渠道提供支撐(如下圖所示)。

最近在刷各大公司的技術博客的時候,我在Linkedin的技術博客上面發現了一篇很不錯博文。這篇博文介紹了Linkedin信息流中間層Feed Mixer,它為Linkedin的Web主頁,大學主頁,公司主頁以及客戶端等多個分發渠道提供支撐(如下圖所示)。

feed_mixer_1

在Feed Mixer里面用到了一個叫做SPR(念“super”)的庫。博文講的就是如何優化SPR的java代碼。下面就是他們總結的優化經驗。

1. 謹慎對待Java的循環遍歷

Java中的列表遍歷可比它看起來要麻煩多了。就以下面兩段代碼為例:

A

  1. private final List<Bar> _bars; 
  2. for(Bar bar : _bars) { 
  3.     //Do important stuff 

B

  1. private final List<Bar> _bars; 
  2. for(int i = 0; i < _bars.size(); i++) { 
  3. Bar bar = _bars.get(i); 
  4. //Do important stuff 

代碼A執行的時候 會為這個抽象列表創建一個迭代器,而代碼B就直接使用 get(i) 來獲取元素,相對于代碼A省去了迭代器的開銷。

實際上這里還是需要一些權衡的。代碼A使用了迭代器,保證了在獲取元素的時候的時間復雜度是 O(1)(使用了 getNext() 和 hasNext() 方法),最終的時間復雜度為 O(n) 。但是對于代碼B,循環里每次在調用 _bars.get(i) 的時候花費的時間復雜度為 O(n) (假設這個list為一個 LinkedList),那么最終代碼B整個循環的時間復雜度就是 O(n^2) (但如果代碼B里面的list是 ArrayList, 那 get(i) 方法的時間復雜度就是 O(1)了)。所以在決定使用哪一種遍歷的方式的時候,我們需要考慮列表的底層實現,列表的平均長度以及所使用的內存。最后因為我們需要優化內存,再加上 ArrayList 在大多數情況下查找的時間復雜度為 O(1) ,最后決定選擇代碼B所使用的方法。

2.在初始化的時候預估集合的大小

從Java的這篇 文檔我們可以了解到: “一個HashMap 實例有兩個影響它性能的因素:初始大小和加載因子(load factor)。 […] 當哈希表的大小達到初始大小和加載因子的乘積的時候,哈希表會進行 rehash操作 […] 如果在一個HashMap 實例里面要存儲多個映射關系時,我們需要設置足夠大的初始化大小以便更有效地存儲映射關系而不是讓哈希表自動增長讓后rehash,造成性能瓶頸。”

在Linkedin實踐的時候,常常碰到需要遍歷一個 ArrayList 并將這些元素保存到 HashMap 里面去。將這個 HashMap 初始化預期的大小可以避免再次哈希所帶來的開銷。初始化大小可以設置為輸入的數組大小除以默認加載因子的結果值(這里取0.7):

優化前的代碼:

  1. HashMap<String,Foo> _map; 
  2. void addObjects(List<Foo> input) 
  3.   _map = new HashMap<String, Foo>();  
  4.   for(Foo f: input) 
  5.   { 
  6.     _map.put(f.getId(), f); 
  7.   } 

優化后的代碼

  1. HashMap<String,Foo> _map; 
  2. void addObjects(List<Foo> input) 
  3. _map = new HashMap<String, Foo>((int)Math.ceil(input.size() / 0.7));  
  4. for(Foo f: input) 
  5. _map.put(f.getId(), f); 

3. 延遲表達式的計算

在Java中,所有的方法參數會在方法調用之前,只要有方法參數是一個表達式的都會先這個表達式進行計算(從左到右)。這個規則會導致一些不必要的操作。考慮到下面一個場景:使用ComparisonChain比較兩個 Foo 對象。使用這樣的比較鏈條的一個好處就是在比較的過程中只要一個 compareTo 方法返回了一個非零值整個比較就結束了,避免了許多無謂的比較。例如現在這個場景中的要比較的對象最先考慮他們的score, 然后是 position, 最后就是 _bar 這個屬性了:

  1. public class Foo { 
  2. private float _score; 
  3. private int _position; 
  4. private Bar _bar; 
  5.    
  6. public int compareTo (Foo other) { 
  7. return ComparisonChain.start(). 
  8. compare(_score, other.getScore()). 
  9. compare(_position, other.getPosition()). 
  10. compare(_bar.toString(), other.getBar().toString()).  
  11. result; 

但是上面這種實現方式總是會先生成兩個 String 對象來保存 bar.toString()和other.getBar().toString() 的值,即使這兩個字符串的比較可能不需要。避免這樣的開銷,可以為Bar 對象實現一個 comparator:

  1. public class Foo { 
  2. private float _score; 
  3. private int _position; 
  4. private Bar _bar; 
  5. private final BarComparator BAR_COMPARATOR = new BarComparator(); 
  6.    
  7. public int compareTo (Foo other) { 
  8. return ComparisonChain.start(). 
  9. compare(_score, other.getScore()). 
  10. compare(_position, other.getPosition()). 
  11. compare(_bar, other.getBar(), BAR_COMPARATOR). 
  12. result(); 
  13. private static class BarComparator implements Comparator<Bar> { 
  14. @Override 
  15. public int compare(Bar a, Bar b) { 
  16. return a.toString().compareTo(b.toString()); 

4. 提前編譯正則表達式

字符串的操作在Java中算是開銷比較大的操作。還好Java提供了一些工具讓正則表達式盡可能地高效。動態的正則表達式在實踐中比較少見。在接下來要舉的例子中,每次調用 String.replaceAll() 都包含了一個常量模式應用到輸入值中去。因此我們預先編譯這個模式可以節省CPU和內存的開銷。

優化前:

  1. private String transform(String term) { 
  2. return outputTerm = term.replaceAll(_regex, _replacement);  

優化后:

  1. private final Pattern _pattern = Pattern.compile(_regex); 
  2. private String transform(String term) { 
  3. String outputTerm = _pattern.matcher(term).replaceAll(_replacement);  

5. 盡可能地緩存Cache it if you can

將結果保存在緩存里也是一個避免過多開銷的方法。但緩存只適用于在相同數據集撒花姑娘嗎的相同數據操作(比如對一些配置的預處理或者一些字符串處理)。現在已經有多種LRU(Least Recently Used )緩存算法實現,但是Linkedin使用的是 Guava cache (具體原因見這里) 大致代碼如下:

  1. private final int MAX_ENTRIES = 1000
  2. private final LoadingCache<String, String> _cache; 
  3. // Initializing the cache 
  4. _cache = CacheBuilder.newBuilder().maximumSize(MAX_ENTRIES).build(new CacheLoader<String,String>() { 
  5. @Override 
  6. public String load(String key) throws Exception { 
  7. return expensiveOperationOn(key); 
  8. ); 
  9.    
  10. //Using the cache 
  11. String output = _cache.getUnchecked(input); 

6. String的intern方法有用,但是也有危險

String 的 intern 特性有時候可以代替緩存來使用。

從這篇文檔,我們可以知道:

“A pool of strings, initially empty, is maintained privately by the class String. When the intern method is invoked, if the pool already contains a string equal to this String object as determined by the equals(Object) method, then the string from the pool is returned. Otherwise, this String object is added to the pool and a reference to this String object is returned”.

這個特性跟緩存很類似,但有一個限制,你不能設置最多可容納的元素數目。因此,如果這些intern的字符串沒有限制(比如字符串代表著一些唯一的 id),那么它會讓內存占用飛速增長。Linkedin曾經在這上面栽過跟頭——當時是對一些鍵值使用intern方法,線下模擬的時候一切正常,但一旦 部署上線,系統的內存占用一下就升上去了(因為大量唯一的字符串被intern了)。所以最后Linkedin選擇使用 LRU 緩存,這樣可以限制最大元素數目。

最終結果

SPR的內存占用減少了75%,進而將feed-mixer的內存占用減少了 50% (如下圖所示)。這些優化減少了對象的生成,進而減少了GC得頻率,整個服務的延遲就減少了25%。

MemUtil_incapacity

本文由 greenrobot 翻譯自Linkedin

責任編輯:張偉 來源: greenrobot
相關推薦

2013-06-19 09:35:32

工程師代碼

2015-05-21 10:43:36

工程師如何寫代碼

2020-03-04 10:48:06

遠程辦公安全網絡監測應用性能監測

2022-09-14 18:23:11

工程師面試Java

2011-11-16 09:47:47

JavaScript

2016-09-22 16:14:45

前端設計Photoshop

2018-03-02 09:10:51

2019-08-28 20:38:12

好代碼編寫代碼代碼質量

2024-03-19 14:38:07

工程師管理經驗

2021-04-22 09:00:00

軟件工程師代碼

2015-08-26 14:18:25

Web前端工程師價值

2015-05-04 13:24:12

工程師OpenStack公有云

2015-09-30 10:25:03

前端工程師

2022-03-14 18:14:17

NetOps網絡

2022-01-16 07:12:30

軟件工程師吵架開發

2012-06-28 14:23:32

Web

2012-08-13 09:35:03

設計師程序員工程師

2009-03-20 09:32:52

系統集成工程師素質

2012-10-12 10:24:43

創業創業公司招聘

2017-10-25 14:28:27

Java工程師火爆原因
點贊
收藏

51CTO技術棧公眾號

久久久久99精品国产片| 麻豆传媒一区二区| 97超碰国产精品女人人人爽| 99热99精品| 欧美激情在线有限公司| av网站大全在线| 一区二区三区国产盗摄 | 欧美性猛交xxxx乱大交3| 欧美午夜欧美| 亚洲精品传媒| 奇米777欧美一区二区| 欧美国产视频在线| 久久91精品国产91久久跳| 一区二区国产盗摄色噜噜| 在线视频亚洲自拍| 肉丝袜脚交视频一区二区| 99视频免费观看| 国产一区日韩欧美| 丁香五月网久久综合| 欧美激情视频一区二区三区免费| 国产精品视频精品| 日韩在线视频精品| 成人激情在线播放| 雨宫琴音一区二区三区| 国产一区二区丝袜| 亚洲特级毛片| 久久久久久a亚洲欧洲aⅴ| 夜夜嗨一区二区| 一区二区视频国产| 95精品视频在线| 黄p免费网站| 美女网站在线观看| 亚洲成人av资源| 一本一道dvd在线观看免费视频| 亚洲成av人片一区二区| 一级二级在线观看| 欧美色综合天天久久综合精品| 国产小视频在线| 精品国产百合女同互慰| 欧美美女日韩| 欧美激情亚洲视频| 国产探花在线精品一区二区| 成人a在线观看| 免费国产自线拍一欧美视频| av电影一区二区三区| 国内精品免费| 91av在线看| 欧美日韩四区| 国产又大又长又粗又黄| 欧美激情一区三区| 你懂的在线播放| 久久综合久久综合久久综合| 成人在线观看黄| 洋洋成人永久网站入口| 91精品国产91久久久久游泳池 | 欧美精品影院| 国产精品丝袜一区二区三区| 亚洲特级毛片| 欧美乱做爰xxxⅹ久久久| 亚洲婷婷国产精品电影人久久| 最新中文在线视频| 亚洲电影av在线| 欧美色图婷婷| 欧美极品一区二区| 久久久久青草大香线综合精品| 中文字幕在线一二| 亚洲精品自拍视频| 久久香蕉国产| 最近中文字幕日韩精品| 免费成人av| 亚洲欧美日韩国产yyy| 国产精品久久一级| 尤物视频在线看| 欧洲日韩成人av| 久久国产综合精品| 李宗瑞系列合集久久| 亚洲欧美成人在线| 欧美 日韩 国产精品免费观看| 国产夫妻自拍一区| 一本久久精品一区二区| 成人午夜888| 日本视频一区二区不卡| 亚洲欧美在线另类| 蜜桃视频www网站在线观看| 国产精品久久一区主播| fc2成人免费人成在线观看播放| 免费理论片在线观看播放老| 久久伊人91精品综合网站| 国产精品观看| 国产精彩免费视频| 日韩精品视频在线| 国产精品99久久久久久动医院| www插插插无码视频网站| 91久久国产最好的精华液| youjizzjizz亚洲| 欧美三级午夜理伦三级老人| 欧美性jizz18性欧美| 97一区二区国产好的精华液| 一区二区高清视频| 精品视频一区二区不卡| 亚洲va久久久噜噜噜久久| 波多野结衣av一区二区全免费观看| 色拍拍在线精品视频8848| 麻豆成人入口| 无码无遮挡又大又爽又黄的视频| 亚洲国产精品福利| 午夜在线精品偷拍| 国产福利在线视频| 国产在线999| 中文字幕在线免费不卡| 亚洲欧美久久精品| 国产欧美自拍视频| 亚洲精品大尺度| 亚洲综合另类| 日本高清中文字幕二区在线| 奇门遁甲1982国语版免费观看高清 | 1024精品视频| 国产超碰在线一区| 瑟瑟视频在线| 99久久精品无码一区二区毛片 | 日韩美女主播在线视频一区二区三区| 日韩欧美自拍| gogo高清免费视频| 国内精品国产三级国产在线专| 国产91高潮流白浆在线麻豆 | 欧美大片顶级少妇| 欧美另类视频| 瑟瑟在线观看| 国产这里只有精品| 亚洲国产成人porn| 欧美系列电影免费观看 | 漫画在线观看av| 亚洲欧美日韩另类精品一区二区三区| 欧美日韩电影一区| 久久福利影视| 日韩久久久久久久久久久久| 91精品一区二区三区在线观看| 欧美日本一区二区视频在线观看| 青青色在线视频| 国产成人精品免费视频大全最热 | 国内精品久久久久久久97牛牛| 飘雪影视在线观看免费观看| 国产日韩av高清| 色噜噜狠狠一区二区三区果冻| 最新国产精品久久久| 黄色毛片在线观看| 麻豆成人av| 亚洲色图日韩av| 91在线视频观看| 哺乳一区二区三区中文视频 | 性色av一区二区三区| 亚洲天堂2016| 色爱综合av| 欧洲伦理片一区 二区 三区| 成人av片网址| 精品久久久久香蕉网| 国产成人精品三级| 麻豆视频一区| 东凛在线观看| 四虎精品欧美一区二区免费| 久久精品美女视频网站| 成人欧美一区二区三区黑人麻豆 | 欧美有码在线观看| 色婷婷久久99综合精品jk白丝| av成人天堂| 日本.亚洲电影| 色国产在线视频| 96pao国产成视频永久免费| 日韩欧美亚洲国产精品字幕久久久 | 青青草视频一区| 成人乱码手机视频| 一级毛片aaaaaa免费看| 精品国产亚洲在线| 国产a久久麻豆| 久久91成人| 在线观看中文字幕的网站| 台湾无码一区二区| 国产成人一区二区三区| 91麻豆精品91久久久久同性| 国产98色在线|日韩| 国产精品自拍区| 2021中文字幕在线| 国产一级电影网| 亚洲欧美99| 国产精品va在线| 亚洲成人999| 一区在线中文字幕| 日本美女一区二区三区视频| 日韩在线观看一区二区三区| 午夜男人视频在线观看| 午夜午夜精品一区二区三区文| 欧美国产日本高清在线| 欧美日韩一区二区三区高清| 成人福利视频在线看| 成人激情在线| 91亚洲精品| 免费黄色网页在线观看| 成年人免费在线播放| 国产一区二区三区无遮挡| 亚洲黄色录像片|