scala - 编译器会尽可能将实例方法的调用优化为静态方法吗?
问题描述
可以说我有类似的东西:
case class StringList(list: List[String]) {
final def isEmpty(): Boolean = list.isEmpty
}
从理论上讲,Scala 编译器可以优化对方法的调用isEmpty()
并使它们成为静态的......所以我不必这样写:
object StringList {
implicit class StringListExtensions(val strList: StringList) extends AnyVal {
def isEmpty(): Boolean = strList.list.isEmpty
}
}
或这个:
object StringList {
def isEmpty(strList: StringList): Boolean = strList.list.isEmpty
}
解决方案
答案是编译器可能不会这样做,因为没有真正的优化。
对象的方法列表保存在一个单独的表中,该表在对象的所有实例之间共享,因此从该表中删除一个方法对内存使用的影响很小。
“静态”版本可能会使调用更有效率,因为它不需要通过这个函数表进行间接调用,但不确定 JIT 编译器在这种情况下会生成更高效的代码。
因此,与往常一样,您应该编写最能表达您想要实现的效果的代码,并且只有当您有经验证据表明这将对您的解决方案产生真正的影响时才担心性能。当您进行优化时,请在担心详细的语言问题之前正确使用算法。
推荐阅读
- python - 那时我应该在 Python 中做什么?
- c# - 如何使用 EF6 部署 Windows 窗体 (WinForm) 应用程序及其数据库
- python - Django API:显示字段的问题
- cefsharp - 如何使 webbrowserextensions::printtopdfasync 评估具有屏幕媒体类型的打印页面?
- swift - SwiftUI inputAccesoryView 实现
- angular - mat-checkbox 总是显示 'Y'
- javascript - 将字符串作为变量传递给文字方法类型提示
- python - 对于用户输入 n,并且 1<=i
For a user input n, and 1<=i<j<=n, find the number of pairs where i*i*i=j*j using python
- c - 无法处理针对 Mac 编写的 C 语言 UDP 客户端-服务器问题
- google-chrome - 性能选项卡显示非常浅的堆栈