我有一个预计会被频繁调用的方法:
private def escapeSpecialCharacters(term: String): String = {
val specialCharacters = Pattern.quote("""\/+-&|!(){}[]^~*?:""")
val specialCharsClassGroup = s"([$specialCharacters])"
val escapedFirstMatch = "\\\\$1"
term.replaceAll(specialCharsClassGroup, escapedFirstMatch)
}
如果将这三个 val
声明为类级常量(因为这样它们可能会在每次调用时重新计算),对性能会有帮助吗?或者编译器是否足够聪明,能够意识到最终产品(specialCharsClassGroup
和 escapedFirstMatch
)是常量,然后将其存储为常量?
这段代码是用 Scala 编写的,但我想它同样适用于 Java。
最佳答案
一些观察:
正如 TravisBrown 所说,虽然过早优化确实有其局限性,但您确实希望最大限度地减少所表达内容的认知负担。
尤其是正则表达式,让每个人都问它是在哪里编译的? b/c 请不要让我在每次调用时都编译正则表达式。
寻求清晰的依赖关系以及对成本所在位置的基本粒度了解。
很明显,如果您像这里一样重用正则表达式,那么您希望在同伴中定义已编译的正则表达式,而不是使用 String#replaceAll
。请改用 Regex#replaceAllIn
。
您想要转义每个可转义字符并不明显。这就是 Regex.quote
的用途,转义字符串。顺便说一句,使用 Regex.quote
而不是 Pattern.quote
只是因为。
此外,尚不清楚为什么不对 escapedFirstMatch
使用三引号。
您确实要求读者在三种不同的上下文之间切换:三重引号、字符串插值器和单引号文字,目前它们在转义方面存在很大差异,令人困惑。
关于java - 将变量声明为类级常量是否比局部变量更能提高性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32185894/