Dav*_*ave 12 performance profiling assert scala preconditions
我们最近一直在分析我们的代码,我们遇到了一些恼人的热点.他们是在形式
assert(a == b, a + " is not equal to " + b)
Run Code Online (Sandbox Code Playgroud)
因为其中一些断言可能在代码中被称为字符串concat开始加起来的次数很多.assert定义为:
def assert(assumption : Boolean, message : Any) = ....
Run Code Online (Sandbox Code Playgroud)
为什么不定义为:
def assert(assumption : Boolean, message : => Any) = ....
Run Code Online (Sandbox Code Playgroud)
这样它会懒洋洋地评估.鉴于它没有定义,是否有一种内联方式调用断言与一个懒惰评估的消息参数?
谢谢
Tho*_*ung 16
延迟评估还为创建的函数对象提供了一些开销.如果您的消息对象已经完全构造(静态消息),则此开销是不必要的.
适用于您的用例的方法是sprintf风格:
assert(a == b, "%s is not equal to %s", a, b)
Run Code Online (Sandbox Code Playgroud)
只要有一个特定的功能
assert(Boolean, String, Any, Any)
Run Code Online (Sandbox Code Playgroud)
这个实现没有开销或var args数组的成本
assert(Boolean, String, Any*)
Run Code Online (Sandbox Code Playgroud)
对于一般情况.
实现toString将被懒惰地评估,但是不可读:
assert(a == b, new { override def toString = a + " is not equal to " + b })
Run Code Online (Sandbox Code Playgroud)
这是一个名字,我在一年前改变了它.
http://www.scala-lang.org/node/825
当前预购:
@elidable(ASSERTION)
def assert(assertion: Boolean, message: => Any) {
if (!assertion)
throw new java.lang.AssertionError("assertion failed: "+ message)
}
Run Code Online (Sandbox Code Playgroud)