慢斯卡拉断言

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)


psp*_*psp 7

这是一个名字,我在一年前改变了它.

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)