日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > php教程 > java性能優化技巧二

java性能優化技巧二

來源:程序員人生   發布時間:2015-04-15 08:59:48 閱讀次數:2902次
之前整理過1篇java性能優化的博客,鏈接java性能優化1,今天補充幾個

1. 謹慎對待Java的循環遍歷
Java中的列表遍歷可比它看起來要麻煩多了。就以下面兩段代碼為例:
A:
  • private final List<Bar> _bars; for(Bar bar : _bars) { //Do important stuff }
  • B:
  • private final List<Bar> _bars; for(int i = 0; i < _bars.size(); i++) { Bar bar = _bars.get(i); //Do important stuff }
  • 代碼A履行的時候 會為這個抽象列表創建1個迭代器,而代碼B就直接使用 get(i) 來獲得元素,相對代碼A省去了迭代器的開消。
  • 實際上這里還是需要1些權衡的。代碼A使用了迭代器,保證了在獲得元素的時候的時間復雜度是 O(1) (使用了 getNext() 和 hasNext() 方法),終究的時間復雜度為 O(n) 。但是對代碼B,循環里每次在調用 _bars.get(i) 的時候花費的時間復雜度為 O(n)  (假定這個list為1個 LinkedList),那末終究代碼B全部循環的時間復雜度就是 O(n^2)  (但如果代碼B里面的list是 ArrayList, 那 get(i) 方法的時間復雜度就是 O(1)了)。所以在決定使用哪種遍歷的方式的時候,我們需要斟酌列表的底層實現,列表的平均長度和所使用的內存。如果我們需要優化內存,再加上 ArrayList 在大多數情況下查找的時間復雜度為 O(1) ,可以選擇代碼B所使用的方法。

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

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


常常碰到需要遍歷1個 ArrayList 并將這些元素保存到 HashMap 里面去,將這個 HashMap 初始化預期的大小可以免再次哈希所帶來的開消。初始化大小可以設置為輸入的數組大小除以默許加載因子的結果值(這里取0.7):
  • 優化前的代碼:
  • HashMap<String,Foo> _map; void addObjects(List<Foo> input) { _map = new HashMap<String, Foo>(); for(Foo f: input) { _map.put(f.getId(), f); } }

    優化后的代碼
  • HashMap<String,Foo> _map; void addObjects(List<Foo> input) { _map = new HashMap<String, Foo>((int)Math.ceil(input.size() / 0.7)); for(Foo f: input) { _map.put(f.getId(), f); } }


  • 3. 延遲表達式的計算

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

public class Foo { private float _score; private int _position; private Bar _bar; public int compareTo (Foo other) { return ComparisonChain.start(). compare(_score, other.getScore()). compare(_position, other.getPosition()). compare(_bar.toString(), other.getBar().toString()). result; } }

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

public class Foo { private float _score; private int _position; private Bar _bar; private final BarComparator BAR_COMPARATOR = new BarComparator(); public int compareTo (Foo other) { return ComparisonChain.start(). compare(_score, other.getScore()). compare(_position, other.getPosition()). compare(_bar, other.getBar(), BAR_COMPARATOR). result(); } private static class BarComparator implements Comparator<Bar> { @Override public int compare(Bar a, Bar b) { return a.toString().compareTo(b.toString()); } } }


4. 提早編譯正則表達式

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

優化前:

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

  • 優化后:
  • private final Pattern _pattern = Pattern.compile(_regex); private String transform(String term) { return outputTerm = _pattern.matcher(term).replaceAll(_replacement); }

5. 盡量地緩存Cache it if you can

將結果保存在緩存里也是1個避免過量開消的方法。現在已有多種LRU(Least Recently Used )緩存算法實現。 


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”.

這個特性跟緩存很類似,但有1個限制,你不能設置最多可容納的元素數目。因此,如果這些intern的字符串沒有限制(比如字符串代表著1些唯1的id),那末它會讓內存占用飛速增長。


作者:jason0539

博客:http://blog.csdn.net/jason0539(轉載請說明出處)

掃碼關注我微信公眾號

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 天堂中文在线视频 | 国产精品午夜在线 | 欧美成人性生活 | 国产福利网站 | 在线一区二区三区 | 一区二区三区在线 | 99re视频在线观看 | 国产h在线观看 | 在线亚洲一区 | 国产美女被遭强高潮免费网站 | 视频免费1区二区三区 | 成人欧美一区二区三区视频网页 | 免费av一区二区三区 | 国产5区| 可以在线观看的av网站 | 综合伊人 | √8天堂资源地址中文在线 一区免费 | 黄色一级片 | 九九综合 | 精品久久网 | 国产精品片在线观看 | 色视在线| 国产乱码精品一区二区三区五月婷 | 欧美日本在线 | 一区二区在线免费 | 97视频在线播放 | 国产精品二区在线 | 欧美日韩高清在线一区 | 一区二区三区免费 | 丁香激情视频 | 欧美视频日韩 | 红桃www.ht123成人| 91高清免费看 | 欧美精品久| 欧美久久视频 | 成人一区二 | 久久麻豆精品 | 99精品在线观看视频 | 国产欧美精品区一区二区三区 | 在线亚洲+欧美+日本专区 | 一级视频在线观看 |