java - 性能:Java 的 String.format

标签 java performance string-concatenation

<分区>

Possible Duplicate:
Should I use Java's String.format() if performance is important?

我想知道在 Java 应用程序中使用 String.format 代替 StringBuilder 是否好...所以,我只写了一个简单的测试,如下所示:

public static void main(String[] args) {
        int i = 0;
        Long start = System.currentTimeMillis();
        while (i < 10000) {
            String s = String.format("test %d", i);
            i++;
        }
        System.out.println(System.currentTimeMillis() - start);
        i = 0;
        start = System.currentTimeMillis();
        while (i < 10000) {
            String s = new StringBuilder().append("test ").append(i).toString();
            i++;
        }
        System.out.println(System.currentTimeMillis() - start);
    }

结果是:

238
15

因此,如果我的测试有效,StringBuilderString.format 更快。好的。 现在,我开始思考 String.format 是如何工作的。它是一个简单的字符串连接,如 "test "+ i 吗?

StringBuilder 连接和String.format 有什么区别?有没有像String.format一样简单,像StringBuilder一样快速的方法?

最佳答案

我写了一个快速 caliper比较 String.format()StringBuilderStringBuffer、普通 String + 运算符、String.replace()String.concat() 方法:

public class StringFormatBenchmark extends SimpleBenchmark {

    public void timeStringFormat(int reps) {
        while (--reps >= 0) {
            String s = String.format("test %d", reps);
        }
    }

    public void timeStringBuilder(int reps) {
        while (--reps >= 0) {
            String s = new StringBuilder("test ").append(reps).toString();
        }
    }

    public void timeStringBuffer(int reps) {
        while (--reps >= 0) {
            String s = new StringBuffer("test ").append(reps).toString();
        }
    }

    public void timeStringPlusOperator(int reps) {
        while (--reps >= 0) {
            String s = "test " + reps;
        }
    }

    public void timeReplace(int reps) {
        while (--reps >= 0) {
            String s = "test {}".replace("{}", String.valueOf(reps));
        }
    }

    public void timeStringConcat(int reps) {
        while (--reps >= 0) {
            String s = "test ".concat(String.valueOf(reps));
        }
    }

    public static void main(String[] args) {
        new Runner().run(StringFormatBenchmark.class.getName());
    }

}

结果如下(Java 1.6.0_26-b03,Ubuntu,32 位):

caliper2

显然 String.format() 慢得多(一个数量级)。此外,StringBufferStringBuilder 慢得多(正如我们被教导的那样)。最后,StringBuilderString + 运算符几乎相同,因为它们编译为非常相似的字节码。 String.concat() 有点慢。

如果简单的连接就足够了,也不要使用 String.replace()

关于java - 性能:Java 的 String.format,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12786902/

相关文章:

java - 使用命令行参数运行 eclipse

algorithm - 有没有超快的算法可以在图片上找到线条?

java - 如何返回列表中所有条目的总和

java - 在java中屏蔽电子邮件地址

java - 从 txt 文件获取数据并将其添加到 JTable 时,如何对哪些数据进入哪列或行进行排序

c++ - 根据处理速度每 x 秒循环一次

android - 如何高效翻译一组观点?

python - Python中的字符串连接与字符串替换

.net - Linq 将复杂类型聚合成一个字符串

java - 串联字节+字符串+字节的 SHA-256