|
|
1
70
在我的迷你基准测试中,第二个大约快25%。
结果:
请注意,这与JRE 1.6.0_07是一致的。 根据Jon Skeet在编辑中的想法,这里是第2版。但结果是一样的。
结果:
|
|
|
2
6
现代的JVM在这方面非常聪明。我不会猜测它,做一些不太容易维护/可读的黑客行为。。。除非你用生产数据做了适当的基准点,以验证一个非平凡的性能改进(并记录它;) |
|
3
26
更快:
在编写实体代码的理念中,方法的内部工作对客户机对象是隐藏的。因此,从系统的角度来看,是否重新声明
即使它要复杂得多,而且您肯定知道对象实例化是瓶颈,也要对它进行注释。 答案是三分:
另一个答案是三分:
虽然不重要,但设置
|
|
|
4
25
在编写可靠代码的哲学中,最好将StringBuilder放在循环中。这样它就不会超出预期的代码范围。 其次,StringBuilder最大的改进来自于给它一个初始大小,以避免它在循环运行时变大
|
|
5
12
好了,我现在明白发生了什么,这是有道理的。
我的印象是
所以在“重用
所有这些都使得第二个版本的效率更高,但同时我仍然认为它的代码更丑陋。 |
|
|
6
9
由于Sun Java编译器内置了优化功能,在看到字符串连接时会自动创建StringBuilders(StringBuffers pre-J2SE 5.0),我认为还没有人指出这一点,因此问题中的第一个示例相当于:
在国际海事组织,这是更好的方法。你的优化尝试可能会在某些平台上带来收益,但可能会在其他平台上造成损失。 但如果你真的遇到了性能问题,那么当然,要不断优化。不过,根据Jon Skeet的说法,我首先要明确指定StringBuilder的缓冲区大小。 |
|
|
7
4
根据我在Windows上开发软件的经验,我认为在循环过程中清除StringBuilder比在每次迭代中实例化StringBuilder具有更好的性能。清除它会释放内存,使其立即被覆盖,无需额外分配。我对Java垃圾收集器还不太熟悉,但我认为释放和不重新分配(除非您的下一个字符串增长了StringBuilder)比实例化更有益。 (我的观点与其他人的建议相反。嗯,是时候对它进行基准测试了。) |
|
8
1
执行“setLength”或“delete”可以提高性能的原因主要是代码“学习”了正确的缓冲区大小,而较少执行内存分配。通常地 I recommend letting the compiler do the string optimizations 但是,如果性能很关键,我通常会预先计算缓冲区的预期大小。默认的StringBuilder大小为16个字符。如果增长超过这个范围,那么它必须调整大小。调整大小是性能下降的地方。下面是另一个小型基准测试,它说明了这一点:
结果表明,重用对象比创建预期大小的缓冲区快10%左右。 |
|
|
9
1
哈哈,我第一次看到人们在StringBuilder中通过组合字符串来比较性能。为此,如果你使用“+”,它可能会更快;D.使用StringBuilder加速检索整个字符串的目的是“局部性”的概念。 在频繁检索不需要频繁更改的字符串值的情况下,Stringbuilder允许更高的字符串检索性能。这就是使用Stringbuilder的目的。。请不要错误地测试它的核心目的。。 有人说,飞机飞得更快。因此,我用我的自行车测试了一下,发现飞机移动得比较慢。你知道我是如何设置实验设置的吗;D |
|
|
10
1
速度并没有显著提高,但从我的测试来看,使用1.6.0_45 64位平均速度要快几毫秒: 使用StringBuilder。setLength(0)而不是StringBuilder。删除():
|
|
|
11
1
最快的方法是使用“设置长度”。它不涉及复制操作。 创建新StringBuilder的方法应该完全过时 .对于StringBuilder来说,速度很慢。删除(int start,int end)是因为它会为调整大小的部分再次复制数组。
之后,StringBuilder。delete()将更新StringBuilder。数到新的尺寸。而StringBuilder。setLength()只需简化更新 StringBuilder。计数 换成新尺寸。 |
|
|
12
0
第一种更适合人类。如果在某些JVM的某些版本上,第二个速度稍微快一点,那又怎样? 如果性能如此关键,请绕过StringBuilder,编写自己的。如果你是一名优秀的程序员,并考虑到你的应用程序是如何使用这个功能的,你应该能够使它更快。值得的可能不会。 为什么这个问题被视为“最喜欢的问题”?因为性能优化非常有趣,不管它是否实用。 |
|
|
13
0
我认为这样优化性能是没有意义的。 今天(2019年),在我的I5笔记本电脑上,这两个状态运行了大约11秒,循环次数为10万次:
==>11000毫秒(循环内声明)和8236毫秒(循环外声明) 即使我运行的是地址推断程序,有几十亿个循环 差2秒。因为1亿次循环没有任何区别,因为程序运行了几个小时。 还要注意,如果只有一条append语句,情况就不同了:
==>3416毫秒(内环),3555毫秒(外环) 在这种情况下,在循环中创建StringBuilder的第一条语句速度更快。 而且,如果你改变执行顺序,速度会快得多:
==>3638毫秒(外环路),2908毫秒(内环路) 当做 乌尔里希 |
|
14
-2
声明一次,每次分配。这是一个比优化更实用、更可重用的概念。 |