gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 12:16:53 25 4
gpt4 key购买 nike

我们必须一直为日志输出等构建字符串。在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com