6

从字符串、整数和浮点数构建字符串的最高效方法是什么?目前我正在这样做,它使用了大量的 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) +
    ";";

有没有办法更快地做到这一点?

4

5 回答 5

20

那应该已经很快了——它将在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来查看编译器生成了什么......

于 2012-04-19T18:18:23.490 回答
3

使用StringBuilder.

String string = new StringBuilder("abcd").append(23).append(false).append("xyz").toString();
于 2012-04-19T18:18:34.187 回答
2

您可以尝试使用StringBuilder.

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

于 2012-04-19T18:18:12.560 回答
1

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

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

于 2012-04-19T18:28:49.047 回答
-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;
    }
}
}
于 2012-11-27T17:13:58.130 回答