在java函数内部或外部操作数据会不会影响性能?

时间:2016-09-28 08:38:03

标签: java function memory-management garbage-collection

我用了一些代码作为例子:

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

在内存使用方面,这些是否优于其他?将函数内部的字符串拆分有助于垃圾收集器吗?

正如我所说,这只是一个很小的例子,真正的代码有巨大的字符串需要分割,并且它每秒都会收到许多这些strins。因此从长远来看差异可能是显而易见的(这是一个需要在100多个小时内开启的软件)。

使用一种方法或另一种方法会有所作为吗?

更新:

此问题与java how expensive is a method call不同。

我不是在问一个方法的调用是否昂贵,我问的是函数内部或外部对String.split();的调用是否有任何区别。

更新2:

如果我有这个怎么办?它会有所不同吗?

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

我忘了提到我经常在(几乎)无限循环中从JVM外部读取(分裂将每秒发生2-10次)。

2 个答案:

答案 0 :(得分: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添加了一些开销。)

答案 1 :(得分:0)

没有区别,因为无论如何都将采用相同的操作。你甚至可以尝试测量所花费的时间,但说实话,这是毫无意义的,你根本不应该担心它,你应该担心的是你的设计以及是否适合传递一个完整的{{1或者分割String