2014-06-10 39 views
1

我真的很喜欢在Scala编写新类时使用require检查。但我担心他们可能会增加的性能成本。斯卡拉'需要'是否会导致性能损失?

所以主要的问题 - 是否有使用require成本? 现在我假设每次创建一个类的实例时,都会检查require中的条件,这是唯一的成本。但我不确定,也许还有其他一些处罚,或者相反,它可能会以一些棘手的方式进行优化。

我意识到,在大多数情况下,即使存在性能损失,与效益相比,其效果可以忽略不计。但是关于下面的例子是什么:

我产生了一些类的多(100万)的情况下,由两个字段和三个功能,蒙特卡罗模拟过程,并执行与这些实例一些简单的操作。你会建议使用require这种情况?

回答

2

IIRC,require实现为whetever出现断言。您显然在构造函数体中讨论require。这只是测试,实际上,甚至有一个参数scalac将省略这些说明(即,不会为其生成代码)。

你可以使用javap自己检查这些东西。

让这是一个初步的答案,直到有人带来更精确的东西。

+0

我不能肯定地说,但在此基础上其他[提问](http://stackoverflow.com/questions/8002835/what-is-the-meaning-of-an-assumption-in-scala-compared看来只有'assert'和'assume'被禁用。还有[this](http://xuwei-k.github.io/scala-library-sxr/scala-library-2.10.0/scala/Predef.scala.html)和[this](http:// www .scala-lang.org/files/archive/api/current/scala/annotation/elidable.html)似乎支持'require'不能切换的事实。 – nevets1219

+0

谢谢,你的回答帮助我认识到'require'只是一个常用的功能,可以在任何地方使用。不幸的是,在许多Scala教程和书籍中,“require”仅作为构造函数的一部分被引入,没有任何额外的解释,这导致我感到困惑。 – GrayR

2

使用require关键字可以基本上做完整性检查(例如空指针)。我相信“消息”部分(require(foo != null, "message"))部分不会被处理,直到失败,在这种情况下,当foo确实等于null。它抛出IllegalArgumentException并且与assertassume非常相似。

我会假设你会带来最小的性能开销,使用它,因为它可以很容易地描述为if (!stmt) throw IllegalArgumentException。显然,它有一定的成本,但可能不是你想要改进的第一件事。

看到这个question and its answers

编辑:我应该补充一点,空指针检查是相当不好,因为你有像Try(..)Some(..)的东西。

+0

不,我在问这个问题时没有注意到空检。我尽量避免在代码的任何地方使用null。我的意思是你需要指定字段之间的某些关系,或者为字段添加约束的用例。例如在扑克牌中,您的牌可能包含2张(翻牌前),5张(翻牌),6张(转牌)或7张(河牌) - 这是'require'的好选择。同样的,如果天真的卡类是使用价值和诉讼领域实施,我会'要求'的值是从1到13。但我明白你在说什么,谢谢你的回复。 – GrayR

+0

哦,我指的是'require'中空检查的例子 – nevets1219