将变量声明为性能级别常量比局部变量更好吗?

时间:2015-08-24 15:18:54

标签: java scala

我有一个预计会经常调用的方法:

private def escapeSpecialCharacters(term: String): String = {
  val specialCharacters = Pattern.quote("""\/+-&|!(){}[]^~*?:""")
  val specialCharsClassGroup = s"([$specialCharacters])"
  val escapedFirstMatch = "\\\\$1"
  term.replaceAll(specialCharsClassGroup, escapedFirstMatch)
}
如果将三个val声明为类级别常量(因为这种方式可能会在每次调用时重新计算它们),或者编译器足够智能以实现最终产品(

,它会有助于性能吗? specialCharsClassGroupescapedFirstMatch)是常量,然后将其存储为常量?

此代码在Scala中,但我想它也适用于Java。

2 个答案:

答案 0 :(得分:2)

一些观察结果:

虽然过早优化有其局限性,但正如TravisBrown所说,你真的希望尽量减少你所表达的认知负担。

特别是正则表达式让每个人都在问它在哪里编译? b / c请不要让我在每次调用时编译一个正则表达式。

寻求清晰度的依赖关系和基本的细节意义,包含成本。

很明显,你想在同伴中定义编译的正则表达式而不是使用String#replaceAll如果你正在重用正则表达式,就像你在这里一样。请改用Regex#replaceAllIn

你想逃离每一个逃避的角色并不明显。这是Regex.quote的用途,以逃避字符串兜售。而且,顺便说一下,使用Regex.quote代替Pattern.quote只是因为。

此外,还不清楚为什么不为escapedFirstMatch使用三引号。

你真的要求读者在三种不同的语境之间切换:三重引号,字符串插值器和单引号文字,它们目前在逃避方面有足够的不同,令人困惑。

答案 1 :(得分:1)

编译器不会为你做这件事。它如何知道方法Pattern.quote()每次都会返回相同的值?你应该把它作为一个字段或常量来提高性能。

尽管如此,移动它所带来的性能提升可能并不那么重要。 Premature optimization is the root of all evil