簡體   English   中英

比較 java 中 2 個大對象的最快方法

[英]Fastest way to compare 2 large objects in java

我想知道比較 java 8 中的 2 個對象的最快方法是什么。我有 2 個具有 100 個屬性的相同 class 對象。

除了逐一檢查屬性的compareTo()方法之外,找到具有不同值的屬性的最快方法是什么。

您可以優化equals方法,以便在發現差異后立即退出。

如果 object 是不可變的,你可以緩存它的hashCode值,比較 hash 值作為equals方法的第一步

另一種優化方法是挑選一些最有可能返回 false 的相等檢查並將它們與所有其他檢查分開。 這將使 JIT 編譯器有機會內聯快速通道。 請注意,這只會在 equals 方法被調用得足夠頻繁以進行編譯並且快速通道實際上是內聯時才能提高性能。 后來取決於它的大小和其他因素。 因此無法保證,您需要使用JMH等微基准工具進行驗證和試驗。

在一種方法中進行所有比較會降低內聯的可能性,因為具有 100 次比較的整個方法對於內聯來說很可能太大了。 JIT 編譯器的分析工作在方法級別,因此完整的方法要么被內聯,要么不被內聯。

請注意,這已經是高級微優化。 僅當您的比較經常使用並且確實需要優化時才執行此操作。 我在我的一個項目中成功地使用了這種方法,在這個項目中,我們有一個高負載場景和緊迫的時間限制。 我們這樣做只是因為我們用完了其他可能的優化。 所以三思而后行,你是否真的想在這里優化。

例子:

public boolean equals(Object other) {

  // fast track that may get inlined as long as it is 
  // not too big
  if (!equalsFast(other)) {
    return false;
  }
  // slow track that will not be inlined but only 
  // called sometimes
  return equalsOthers(other);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM