java - 使用 javac 1.8 的字符串连接性能比 Eclipse 编译器更好?

标签 java eclipse string

我是 Java 新手。

起初,我在不同情况下测试 StringStringBuilder 的性能。

但是,我发现 javaceclipse 编译的相同代码执行不同。

我了解到 String 连接实际上是使用 StringBuilder 但为什么在这种情况下性能有如此大的差异,而 String 比 StringBuilder 快 1.5 倍

这是我的测试代码:

public class StringTest {
    public StringTest() {
        boolean flag = true;
        int code = 10001, type = 1;

        long time = System.nanoTime();
        for (int i = 0; i < 10000000; ++i) {
            String msg = Long.toString(i * 1000000000);
            stringHandler(code, type, flag, msg);
        }
        System.out.println("Took " + (System.nanoTime() - time) + " ns by String");

        time = System.nanoTime();
        for (int i = 0; i < 10000000; ++i) {
            String msg = Long.toString(i * 1000000000);
            stringBuilderHandler(code, type, flag, msg);
        }
        System.out.println("Took " + (System.nanoTime() - time) + " ns by StringBuilder");
    }

    public String stringBuilderHandler(int code, int type, boolean flag, String msg) {
        StringBuilder sb = new StringBuilder();

        sb.append("{\"bool\":").append(flag).append(",")
                .append("\"code\":").append(code).append(",")
                .append("\"type\":").append(type).append(msg).append("}");

        return sb.toString();
    }

    public String stringHandler(int code, int type, boolean flag, String msg) {
        String str = "{\"bool\":";
        str += flag;
        str += ",";
        str += "\"code\":";
        str += code;
        str += ",";
        str +=  "\"type\":";
        str += type;
        str += msg;
        str += "}";
        return str;
    }

    public static void main(String[] args) {
        StringTest st = new StringTest();
    }
}

使用 javac 1.8:

Took 1066623964 ns by String
Took 1540007855 ns by StringBuilder

使用 Eclipse:

Took 4282720864 ns by String
Took 1709934263 ns by StringBuilder

最佳答案

在您的 stringBuilderHandler 中存在一个巨大问题,那就是您在每次调用时都创建了一个新的 StringBuilder 实例,当您应该重用相同的实例来查看串联。在 stringHandler 中做类似的事情:重用相同的 String 变量,然后你会注意到不同之处。此外,您应该遵循适当的微基准测试规则,如下所示:How do I write a correct micro-benchmark in Java?或者使用像 Caliper 或 JMH 这样的微型基准测试框架。

关于java - 使用 javac 1.8 的字符串连接性能比 Eclipse 编译器更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30442980/

相关文章:

java - Java 中的监视器是什么?

java - 无法通过 Web 服务以编程方式运行 jar 文件

android - Eclipse - 更改 Proguard 和 list 文件后的几个错误

java - 如何更改eclipse中注释的层次结构?

c++ - 将 v8::String 转换为 LPCWSTR?

java - 如何在Gurobi中编写以下目标函数?

java - XMLWorker 不调用我的 servlet 来渲染 pdf 中的图像

java - 编译错误 - 在 Redhat "Openshift"应用程序中找不到包 com.google.gson

c - char指针如何成为整个字符串?

python - Pandas DataFrame [cell=(label,value)],分为 2 个独立的数据框