我们必须一直为日志输出等构建字符串。在 JDK 版本中,我们了解了何时使用 StringBuffer
(许多附加,线程安全)和 StringBuilder
(许多附加,非线程安全)。
使用 String.format()
有什么建议?它是有效的,还是我们被迫坚持对性能很重要的单行进行串联?
例如丑陋的旧风格,
String s = "What do you get if you multiply " + varSix + " by " + varNine + "?";
对比整洁的新样式(String.format,可能比较慢),
String s = String.format("What do you get if you multiply %d by %d?", varSix, varNine);
注意:我的具体用例是贯穿我的代码的数百个“单行”日志字符串。它们不涉及循环,因此 StringBuilder
太重了。我对 String.format()
特别感兴趣。
最佳答案
我拿了hhafez代码并添加了内存测试:
private static void test() {
Runtime runtime = Runtime.getRuntime();
long memory;
...
memory = runtime.freeMemory();
// for loop code
memory = memory-runtime.freeMemory();
我为每种方法分别运行此操作,“+”运算符、String.format 和 StringBuilder(调用 toString()),因此使用的内存不会受到其他方法的影响。 我添加了更多的连接,使字符串为 "Blah"+ i + "Blah"+ i +"Blah"+ i + "Blah"。
结果如下(平均每次5次):
方法 时间(毫秒) 分配的内存(长)
'+' 运算符 747 320,504
String.format 16484 373,312
StringBuilder 769 57,344
我们可以看到 String '+' 和 StringBuilder 在时间上实际上是相同的,但 StringBuilder 在内存使用方面要高效得多。 当我们在足够短的时间间隔内有许多日志调用(或任何其他涉及字符串的语句)时,这一点非常重要,这样垃圾收集器就不会清理由“+”运算符产生的许多字符串实例。
顺便说一句,别忘了在构造消息之前检查日志记录级别。
结论:
- 我会继续使用 StringBuilder。
- 我的时间太多或生命太少。
关于java - 如果性能很重要,我应该使用 Java 的 String.format() 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/513600/