2016-09-28 85 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

相关问题