java - 如果性能很重要,我应该使用 Java 的 String.format() 吗?

标签 java string performance string-formatting micro-optimization

我们必须一直为日志输出等构建字符串。在 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 在内存使用方面要高效得多。 当我们在足够短的时间间隔内有许多日志调用(或任何其他涉及字符串的语句)时,这一点非常重要,这样垃圾收集器就不会清理由“+”运算符产生的许多字符串实例。

顺便说一句,别忘了在构造消息之前检查日志记录级别

结论:

  1. 我会继续使用 StringBuilder。
  2. 我的时间太多或生命太少。

关于java - 如果性能很重要,我应该使用 Java 的 String.format() 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/513600/

相关文章:

java - Hibernate二级缓存并不是在所有情况下都使用

java - Android:检查字符串值是否等于 [""]

c# - 剪切具有已知开始和结束索引的字符串

java - C或Java中同时为真和假的条件

java - 从 PEM 获取私钥

java - 如何操作一串 INSERT 数据并以正确的方式分隔列的值?

javascript - 三.js性能问题

performance - 使用 ReactJS 的优缺点

android - 如果我们使用多个 APK,BuildConfig.VERSION_CODE 不会改变吗

java - 将 jena 模型转换为 jena tdb