[问题] string串接问题

楼主: a89051236 (HarryPC)   2023-12-01 10:47:52
想请问不同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一步一步看
楼主: a89051236 (HarryPC)   2023-12-01 13:12:00
请问“没必要不要用StringBuffer”的原因为何呢?
作者: gasbomb (虚空雷神兽)   2023-12-02 01:36:00
你不应该print的 print很花时间这样根本看不出差异
作者: jtorngl (Pedrosa go!)   2023-12-02 01:53:00
StringBuffer 的 API 都有宣告 synchronized
作者: Jichang (C.C.Lemon)   2023-12-02 21:26:00
乱测一通 哈哈 1.不能print 2.stringbuffer不是这样用
作者: sw12 (专注.幽默)   2023-12-07 14:17:00
jdk版本要注明一下。另外,没差。差在你纪录输出的时间
作者: so1omon1991   2022-01-02 13:19:00
很在意内存占用状况的话改用StringBuilder吧
作者: gmoz ( This can't do that. )   2022-03-20 18:00:00
这测试没啥意义啊 字串不断连接的要够长才有意义

Links booklink

Contact Us: admin [ a t ] ucptt.com