Java最快的连接字符串,整数和浮点数的方法

时间:2012-04-19 18:16:26

标签: java string-concatenation

从字符串,整数和浮点数构建字符串的最高效方法是什么?目前我正在这样做,它使用了大量的cpu时间。

String frame = this.frameTime + ":" +
    this.player.vertices[0].x + "," +
    this.player.vertices[0].y + "," +
    this.player.activeAnimId + "," +
    (int)this.player.virtualSpeed + "," +
    this.map.getCurrentTime() + 
    (this.player.frameSound == -1 ? "" : "," + this.player.frameSound) +
    (this.player.frameDecal.equals("") ? "" : "," + this.player.frameDecal) +
    ";";

有没有办法更快地完成这项工作?

5 个答案:

答案 0 :(得分:19)

这应该已经很快了 - 它会在内部使用StringBuilder进行连接。可以明确地使用StringBuilder可以消除空字符串的连接,但它不太可能产生很大的不同。

你有多少次这样做?它必须经常发生,因为它是一个瓶颈......你真的需要经常这样做吗?

编辑:对于那些说“使用StringBuilder,它会更快”的人 - 请考虑以下代码:

public class Test
{
    public static void main(String[] args)
    {
        int x = 10;
        int y = 20;
        int z = 30;
        String foo = x + "," + y + "," + z + ";";
        System.out.println(foo);
    }
}

编译它,然后使用javap -c查看编译器生成的内容......

答案 1 :(得分:1)

您可以尝试使用StringBuilder

(但是,大多数值得盐的Java编译器会自动优化您列出的代码,以便在幕后使用StringBuilder。)

答案 2 :(得分:1)

使用StringBuilder

String string = new StringBuilder("abcd").append(23).append(false).append("xyz").toString();

答案 3 :(得分:1)

如果你想要它的速度非常快,你可以尝试我的库,它允许你在微秒内记录消息,而不会产生任何垃圾。 https://github.com/peter-lawrey/Java-Chronicle

(正如我所说,它可能超出你想要的顶部)

答案 4 :(得分:-1)

concat3方法对我来说效果最快,concat1的性能依赖于jvm实现/优化,它可能在其他版本的JVM中表现更好但是在我的windows机器和我测试的远程linux red hat机器上显示concat3工作速度最快..

public class StringConcat {

public static void main(String[] args) {
    int run = 100 * 1000 * 1000;
    long startTime, total = 0;

    final String a = "aafswerg";
    final String b = "assdfsaf";
    final String c = "aasfasfsaf";
    final String d = "afafafdaa";
    final String e = "afdassadf";

    startTime = System.currentTimeMillis();
    concat1(run, a, b, c, d, e);
    total = System.currentTimeMillis() - startTime;
    System.out.println(total);

    startTime = System.currentTimeMillis();
    concat2(run, a, b, c, d, e);
    total = System.currentTimeMillis() - startTime;
    System.out.println(total);

    startTime = System.currentTimeMillis();
    concat3(run, a, b, c, d, e);
    total = System.currentTimeMillis() - startTime;
    System.out.println(total);
}

private static void concat3(int run, String a, String b, String c, String d, String e) {
    for (int i = 0; i < run; i++) {
        String str = new StringBuilder(a.length() + b.length() + c.length() + d.length() + e.length()).append(a)
                .append(b).append(c).append(d).append(e).toString();
    }
}

private static void concat2(int run, String a, String b, String c, String d, String e) {
    for (int i = 0; i < run; i++) {
        String str = new StringBuilder(a).append(b).append(c).append(d).append(e).toString();
    }
}

private static void concat1(int run, String a, String b, String c, String d, String e) {
    for (int i = 0; i < run; i++) {
        String str = a + b + c + d + e;
    }
}
}