想请问不同string串接方法的效能比较。
我写了以下的方式(请详下图)来测试各种写法的效能(耗时),
目前从结果来看是A循环优于B优于C优于D(但秒数会浮动,不知是否有更好的测试方法?
)
我已经知道各循环差异大概如下:
A循环因为是常量会在compile时就处理,故runtime时不用再做处理。
C循环因为用StringBuffer串接时不会再new物件故效能优于D循环。
D循环因为string是immutable object,因此在a=a+b时会修改a在内存中的位置,故比C
循环耗效能。
但应该如何看B循环呢?
a+b没有指定给任何field,那系统是否会在内存中分配一个新的位置给(a+b)?如同new
一个物件一样会耗效能。
另外是否有方法可以测试或判断是否有在内存中分配新位置?
再麻烦,谢谢
https://i.imgur.com/XgTiMTk.jpg
作者:
ssccg (23)
2023-12-01 11:54:00单以这四种写法(不论循环)结论是看compiler如果你实际用的地方没循环,不要想太多通通用 + 让compiler和jvm选择最好的作法,不要再去研究这个问题只有在循环内串接的字串,会在循环结束后使用时,才需要在循环外宣告StringBuilder (没必要不要用StringBuffer)如果你是想研究compiler做了什么,看.class档的bytecode有什么差别(javap),要看实际执行就开debug一步一步看
请问“没必要不要用StringBuffer”的原因为何呢?
作者:
gasbomb (虚空雷神兽)
2023-12-02 01:36:00你不应该print的 print很花时间这样根本看不出差异
作者:
jtorngl (Pedrosa go!)
2023-12-02 01:53:00StringBuffer 的 API 都有宣告 synchronized
作者:
Jichang (C.C.Lemon)
2023-12-02 21:26:00乱测一通 哈哈 1.不能print 2.stringbuffer不是这样用
作者:
sw12 (专注.幽默)
2023-12-07 14:17:00jdk版本要注明一下。另外,没差。差在你纪录输出的时间
作者: so1omon1991 2022-01-02 13:19:00
很在意内存占用状况的话改用StringBuilder吧
作者:
gmoz ( This can't do that. )
2022-03-20 18:00:00这测试没啥意义啊 字串不断连接的要够长才有意义
作者: internetms52 (Oaide) 2022-06-06 08:43:00
我这里遇到的极端案例也是StringBuilder在内存上有差异