Appender 和 ~ 有什么区别?
What is the difference between Appender and ~?
我读到如果我经常分配字符串我应该使用Appender,但是Appender
和~
运算符的主要工作有什么不同?
它们(afaik)都是use GC内存分配。那么区别是什么呢?哪一个比另一个更好?
所以 appender
替换的是 ~=
运算符,而不是 ~
运算符。 ~
总是创建一个新副本而不实际附加到现有副本(它保持旧副本不变),这使得它成为一种低效的便利,当性能很重要时通常应该避免。
但无论如何,~=
和 appender
实际上并没有太大区别。关键区别在于 ~=
将其容量缓存保留在 GC 中,而 Appender
则将其随身携带。如果您只是使用少量彼此靠近的数组,您可能不会注意到两者之间的区别。
但是,如果你同时处理许多数组并进行大量追加,或者做任何多线程的事情,那么 Appender 的本地容量存储会给你带来相当大的提升,因为它在请求时避免了全局锁定GC 的容量缓存,并确保您在不同阵列之间切换时不会破坏全局缓存。
Appender
也恰好是一个封装的输出范围,因此您可以将它传递给一些需要该接口的函数,尽管在大多数情况下您也可以使用常规数组和正确的导入。
因此,如果您只是在循环中附加到一个数组,请继续使用 ~=
,您可能不会注意到差异(事实上,我个人发现 ~=
在这些情况下会快一点,但是通过优化构建的差异可以忽略不计)但是如果你正在存储 appender 本身(而不仅仅是最终结果)或者一次做几个数组,或者编写一个多线程程序, 那么 Appender
可以给你一个显着的提升,因为它避免了使用全局 GC 缓存时的争用。
我读到如果我经常分配字符串我应该使用Appender,但是Appender
和~
运算符的主要工作有什么不同?
它们(afaik)都是use GC内存分配。那么区别是什么呢?哪一个比另一个更好?
所以 appender
替换的是 ~=
运算符,而不是 ~
运算符。 ~
总是创建一个新副本而不实际附加到现有副本(它保持旧副本不变),这使得它成为一种低效的便利,当性能很重要时通常应该避免。
但无论如何,~=
和 appender
实际上并没有太大区别。关键区别在于 ~=
将其容量缓存保留在 GC 中,而 Appender
则将其随身携带。如果您只是使用少量彼此靠近的数组,您可能不会注意到两者之间的区别。
但是,如果你同时处理许多数组并进行大量追加,或者做任何多线程的事情,那么 Appender 的本地容量存储会给你带来相当大的提升,因为它在请求时避免了全局锁定GC 的容量缓存,并确保您在不同阵列之间切换时不会破坏全局缓存。
Appender
也恰好是一个封装的输出范围,因此您可以将它传递给一些需要该接口的函数,尽管在大多数情况下您也可以使用常规数组和正确的导入。
因此,如果您只是在循环中附加到一个数组,请继续使用 ~=
,您可能不会注意到差异(事实上,我个人发现 ~=
在这些情况下会快一点,但是通过优化构建的差异可以忽略不计)但是如果你正在存储 appender 本身(而不仅仅是最终结果)或者一次做几个数组,或者编写一个多线程程序, 那么 Appender
可以给你一个显着的提升,因为它避免了使用全局 GC 缓存时的争用。