java - 将变量声明为类级常量是否比局部变量更能提高性能?

标签 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。

最佳答案

一些观察:

正如 TravisBrown 所说,虽然过早优化确实有其局限性,但您确实希望最大限度地减少所表达内容的认知负担。

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

寻求清晰的依赖关系以及对成本所在位置的基本粒度了解。

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

您想要转义每个可转义字符并不明显。这就是 Regex.quote 的用途,转义字符串。顺便说一句,使用 Regex.quote 而不是 Pattern.quote 只是因为。

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

您确实要求读者在三种不同的上下文之间切换:三重引号、字符串插值器和单引号文字,目前它们在转义方面存在很大差异,令人困惑。

关于java - 将变量声明为类级常量是否比局部变量更能提高性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32185894/

相关文章:

java - 未经检查的泛型的问题

Scala 工厂模式根据泛型类型返回具体类

java - 如何完全关闭/删除 JFrame

java - 将多个对象合并到 java.lang.Object 的单个实例中

java - 一个非常基本的 applet/swing 要求

java - 将日期插入日期时间类型列

Scala 懒惰 val : a good way to go easy on the garbage collector?

scala - View 边界与类型上限不兼容?

scala - 伴侣对象无法访问类上的私有(private)变量

scala中的xml属性解析