簡體   English   中英

重復的函數調用與將結果存儲在臨時變量中

[英]Repeated function calls vs. storing results in temporary variable

我的代碼如下所示:

class Main {
    public static void main(String args[]){
         String[] s1 = {"This ", "is ", "a ","sentence ", "."}; 
         String sentence = Arrays.toString(s1);
         System.out.println(sentence.substring(4, sentence.length()-1));
    }

    private static <T> String arrayToString(T[] t){
         StringBuilder sb = new StringBuilder();
         for(T val: t){
            sb.append(val.toString());
         }
    }
}

我試圖單行執行上述操作:

System.out.println(arrayToString(s1).substring(
                                       4, arrayToString(s1).length()));

我的問題是,為了避免存儲對計算值的引用,我多次調用了arrayToString()方法。

  1. 將對arrayToString進行多次計算嗎?
  2. Java中是否有某種機制可以減少這些多次調用的代價?
  3. 我最好使用以前版本的代碼嗎?
  1. 變量是最直接的方法。 您還可以實現某種形式的緩存/內存化,以便在調用函數時將檢查其是否已經計算過結果並直接返回。
  2. 是的-有幾種更好的選擇。 對於一個而言,您不會最終兩次調用arrayToString ,對於另一個而言,它更具可讀性,因為我們現在知道arrayToString返回某種“類似於句子”的對象。 使用變量會添加更多有用的上下文,並使代碼更具可讀性。

通常,在使用Java進行編碼時,您應該認識到, 更頻繁地執行代碼時,您的代碼是及時編譯的。 由於計算

arrayToString(s1).substring(4, arrayToString(s1).length())

可以預見,您可以期望即時編譯器啟動后,性能損失會得到解決,因為它將自己為計算創建緩存。 對於任何要優化的代碼來說,這當然是一個過於樂觀的假設,但是對於Java,通常最好堅持編寫可讀代碼,而不必過於擔心性能,代碼抽象和性能之間的這種差距部分地由Java消除。 Java虛擬機。

通常,您可以使用我只能推薦的工具(例如JIT watch)來監視已編譯代碼的性能。 有時很難確定性能瓶頸,但是根據我的經驗,像您這樣的代碼永遠不會導致不良的用戶體驗,因為僅是處理幾個時間周期的簡單字符串,這甚至不足以ping數據庫。 就在您閱讀本文時,我的手機可能已經完成了數十億次的計算。

總而言之,人們過於擔心性能。 編寫可維護且易讀的代碼應該始終是您的主要目標。

暫無
暫無

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

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