我非常喜欢在Scala中编写新类时使用require
检查。但我担心他们可能会增加性能成本。
所以主要问题 - 使用require
会有成本吗?
现在我假设每次创建一个类的实例时,都会检查require
中的条件,这是唯一的成本。但我不确定,也许还有一些其他的惩罚或相反可能它以某种棘手的方式进行了优化。
我意识到在大多数情况下,即使存在性能损失,与利益相比也可以忽略不计。但是下面的例子怎么样:
我在Monte-Carlo模拟过程中生成了许多(100万)某类的实例,包括两个字段和三个函数,并对这些实例执行一些简单的操作。你会建议使用require
这样的场景吗?
答案 0 :(得分:2)
require
被实现为它们出现时的断言。您显然是在构造函数体中讨论require
。这只是测试,实际上,scalac
的参数甚至会省略这些指令(也就是说,不会为它们生成代码)。
您可以使用javap
自行检查这些内容。
让这成为一个初步的答案,直到某人得到更精确的东西。
答案 1 :(得分:2)
使用require
关键字可以基本上进行健全性检查(例如空指针)。我相信"消息"部分(require(foo != null, "message")
)部分在失败之前不会被处理,在这种情况下,当foo等于null
时会发生这种情况。它会抛出IllegalArgumentException
,与assert
和assume
非常相似。
我认为使用它会产生最低的性能成本,因为它可以很容易地描述为if (!stmt) throw IllegalArgumentException
。显然,它有一些成本,但可能不是你想要改进的第一件事。
编辑:我应该补充一点,因为你有像Try(..)
和Some(..)
之类的东西,空指针检查非常糟糕。