簡體   English   中英

Java中長方法鏈的優化

[英]Optimization of long method chain in Java

在應用程序中分析一些預先存在的第三方Java代碼(無法重寫),我發現它幾乎完全是在長方法鏈上構建的

public Object process() {
  // Do some class-specific stuff
  return this.getChild().process();
}

其中有一個定義process()方法的基類,由子類繼承,重新定義該方法,並在最后重復getChild()調用。

由於條件塊,在運行時創建(分支)多個這樣的鏈,其中一些可能相對較早地返回(例如,在鏈中的10-20個“鏈接”之后),但最常見的是鏈的“長度”。在返回結果之前,它要大得多,甚至可以超過100次連續方法調用。

應用程序使用此代碼處理大型文件,每次調用頂級方法時結果都會更改,通常每個文件的每個不同行一次。

那么,有兩個問題:

  • 與“常規”設計相比,這種設計應該具有什么樣的性能影響?
  • 是否有任何技巧可以顯着提高該代碼的性能(例如,通過更改某些JVM參數)?

方法調用非常快(每秒10秒或100萬),因此首先通過分析系統確保它實際上是有益的。

否則,您可以使用緩存來提高效率,尤其是在結果一致的情況下(相同的輸入,相同的輸出)。

例如:

Object cache = null;

public Object process() {
   if (cache == null)
      cache = this.getChild().process();

   return cache;
}

如果涉及某種輸入或狀態,則可以使用Map作為緩存,該緩存使用輸入值的鍵並存儲輸出值的值。

表格聲明

return getChild().process();

並沒有什么不同

SomeType var = getChild();
return var.process();

在這兩種情況下,將在另一個方法之后調用一個方法,並且getChild()的返回值將用作process()調用的接收方。

如果您正在尋找不相關的次要技術細節,則第一個表單不需要本地變量。 但是由於在HotSpot中,在創建線程時預先分配了固定大小的堆棧內存,因此無法感知這兩種形式之間的任何差異。

這兩種形式之間的選擇純粹是一種風格。

暫無
暫無

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

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