为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

饮歌长啸 2019-10-23 16:36:14
我们必须一直构建String以便进行日志输出等等。在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()特别感兴趣。
查看完整描述

3 回答

?
撒科打诨

TA贡献1934条经验 获得超2个赞

我使用了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。

我的时间太多或生活太少。


查看完整回答
反对 回复 2019-10-23
?
繁花如伊

TA贡献2012条经验 获得超12个赞

JAVAC 1.6会自动将您以前的丑陋样式编译为:


StringBuilder sb = new StringBuilder("What do you get if you multiply ");

sb.append(varSix);

sb.append(" by ");

sb.append(varNine);

sb.append("?");

String s =  sb.toString();

因此,这与使用StringBuilder绝对没有区别。


String.format具有更大的重量,因为它创建了一个新的Formatter,解析了您的输入格式字符串,创建了一个StringBuilder,将所有内容附加到它并调用toString()。


查看完整回答
反对 回复 2019-10-23
  • 3 回答
  • 0 关注
  • 4101 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信