【发布时间】:2026-02-06 13:05:01
【问题描述】:
我有两种读取字符串和创建字符对象的方法:
static void newChar(String string) {
int len = string.length();
System.out.println("Reading " + len + " characters");
for (int i = 0; i < len; i++) {
Character cur = new Character(string.charAt(i));
}
}
和
static void justChar(String string) {
int len = string.length();
for (int i = 0; i < len; i++) {
Character cur = string.charAt(i);
}
}
当我使用 18,554,760 个字符串运行这些方法时,我得到了截然不同的运行时间。我得到的输出是:
newChar took: 20 ms
justChar took: 41 ms
对于较小的输入(4,638,690 个字符),时间变化不大。
newChar took: 12 ms
justChar took: 13 ms
为什么 new 在这种情况下效率更高?
编辑:
我的基准代码很老套。
start = System.currentTimeMillis();
newChar(largeString);
end = System.currentTimeMillis();
diff = end-start;
System.out.println("New char took: " + diff + " ms");
start = System.currentTimeMillis();
justChar(largeString);
end = System.currentTimeMillis();
diff = end-start;
System.out.println("just char took: " + diff+ " ms");
【问题讨论】:
-
请向我们展示您的基准代码。
-
颠倒你在基准测试中的测试顺序,看看你是否得到相同的行为。
-
你需要循环的远不止这些。否则,你只会遇到 JVM 的热身效果。您是否尝试过切换测试顺序?
-
...顺便说一句,我(强烈)建议使用适当的微基准框架来考虑预热和 c。 Criterium 是 Clojure 的黄金标准;对于纯 Java,请尝试 code.google.com/p/caliper
-
我已经在
jmh中确认了 OP 的结果:对于我的字符串,justChar需要 38 微秒,newChar需要 19 微秒。
标签: java performance new-operator