2016-09-28 30 views
0

我了一個小的代碼作爲一個例子使用:在Java函數內部或外部操作數據,是否會影響性能?

public class Main { 

    public static void main(String[] args) { 
     String hugeString = "a,a,a,a"; 

     splitOutside(hugeString.split(",")); 
     splitInside(hugeString); 

    } 

    private static void splitInside(String string) { 
     String splitData[] = string.split(","); 
     for (int i = 0; i < splitData.length; i++){ 
      System.out.print(splitData[i]); 
     } 
     System.out.println(""); 
    } 

    public static void splitOutside(String[] splitData) { 
     for (int i = 0; i < splitData.length; i++){ 
      System.out.print(splitData[i]); 
     } 
     System.out.println(""); 
     } 
} 

我有兩個不同的功能,和splitOutsidesplitInside,在這種情況下。

在內存使用情況方面,這些優於其他嗎?將分割函數內的字符串幫助垃圾收集器?

正如我所說的,這只是一個很小的例子,真正的代碼有巨大的字符串需要拆分,並且每秒都會收到很多這樣的字符串。所以從長遠來看,這種差異可能是顯而易見的(這是一個需要超過100小時的ON的軟件)。

它會使用一種方法或其他方法有所作爲嗎?

更新:

這個問題是不一樣的java how expensive is a method call

我不是問一個方法的調用是否很昂貴,我在問函數String.split();在函數內部還是外部的調用有什麼區別。

更新2:

,如果我有這樣的麼?它會不同嗎?

while ((hugeString = br.readLine()) != null) { 
    splitOutside(hugeString.split(",")); 
    splitInside(hugeString); 
} 

我忘了提,我不斷地從JVM課外閱讀在(幾乎)無限循環(分裂會發生2-10次秒)。

+0

除非你打算多次拆分數據,我可以看到沒有區別 –

+0

我這樣做它每秒2-10次(使用不同的字符串)超過100小時。 2-10,因爲它取決於其他軟件的輸入。 – Tuzane

+0

可能重複[java多少錢是一個方法調用](http://stackoverflow.com/questions/6495030/java-how-expensive-is-a-method-call) – xenteros

回答

2

沒有區別。 hugeString.split(",")的結果只有在使用它的方法完成時纔可以使用,因爲這是接收引用的代碼的唯一部分。在splitInside方法中也是如此。

爲了減少佔用空間這將是迄今爲止最好不要在內存中保存完整的數組,但發現子一前一後:

private static final Pattern PATTERN = Pattern.compile("[^,]*"); 

private static void splitInside(String string) { 
    Matcher matcher = PATTERN.matcher(string); 
    while (matcher.find()) { 
     System.out.print(matcher.group()); 
    } 
    System.out.println(); 
} 

注意,這裏只存在於一個單一的參考子字符串一次而不是所有的一次。 (儘管你爲Pattern/Matcher增加了一些開銷。)

+0

我更新了。請檢查更新2。我在一個循環中執行它,當垃圾收集器可以釋放內存時會有什麼區別嗎? – Tuzane

+0

@Mayuso:沒有什麼區別......爲什麼會這樣?解釋仍然適用。 – fabian

+0

我只是認爲外部函數(包含while循環,在這種情況下是主函數)會永遠保持hugeString的數據(你知道,因爲它的函數永遠不會結束,它總是停留在while循環中)。同時,在splitInside(hugeString)'結束時,在函數中分割字符串將釋放內存。在我看來,這是有道理的,因爲你可以看到我不是專家,我想我錯了:)謝謝你的幫助。 – Tuzane

0

沒有什麼區別,因爲無論如何將應用相同的操作。你甚至可以嘗試測量所花費的時間,但說實話,這是毫無意義的,你根本不應該擔心,你應該擔心的是你的設計以及是否適合通過一個完整的String或一個拆分String

+0

我更新了。請檢查更新2。我在一個循環中執行它,當垃圾收集器可以釋放內存時會有什麼區別嗎? – Tuzane

相關問題