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 に答える