我想在我的Scala应用程序中对几种方法的运行时间进行基准测试,并且正在考虑使用ScalaMeter。假设我要测量称为的方法的时间doSomething()
。
我只想调用doSomething
并测量一次运行所需的时间。但是,我为ScalaMeter看到的所有文档都需要提供某种输入,无论它是一系列整数,字符串还是其他东西。
是否可以使用ScalaMeter来完成我要求的操作?这是一个合适的用例吗?
可以,但是会浪费时间。
您可能已经知道,ScalaMeter旨在消除函数执行时间变化的影响,因此可以准确地确定那些执行时间的基准。例如,您可能想验证功能是否在要求的时间内完成,或者确定随着对代码库的更改,该功能的性能是否随着时间的推移得以保持。
为什么这么有挑战性?好吧,有许多障碍需要克服:
size
List
List
显然,应该在同一台主机上执行基准测试,以使结果具有可比性,因为CPU,操作系统,内存,BIOS配置等也都会影响性能。
因此,在解释了所有这些内容之后,您将了解为什么ScalaMeter需要大量执行相同的功能!;-)
在您的情况下,不doSomething()
带任何参数,因此可以使用Gen[T].single
生成器来标识doSomething()
所属的类或对象,该生成器看起来类似于以下内容:
注意:这是作为ScalaMeter测试编写的,因此源应位于src/test/scala
:
import org.scalameter.api._
import org.scalameter.picklers.Implicits._
object MyBenchmark
extends Bench.ForkedTime {
// We have no arguments. Instead, create a single "generator" that identifies the class or
// object that doSomething belongs to. This assumes doSomething() belongs to object
// MyObject.
val owner = Gen.single("owner")(MyObject)
// Measure MyObject.doSomething()'s performance.
performance of "MyObject" in {
measure method "doSomething()" in {
using(owner) in {
_.doSomething()
}
}
}
}
(顺便说一句:我本以为没有参数的基准测试函数会比这更直接,但这是到目前为止我能想到的最好的方法。如果有人有更好的主意,请添加注释并让我知道!)
因此,如果所有这些都是矫kill过正,那么您可能想要尝试这样的事情:
// Measure nanoseconds taken to execute by name argument.
def measureTime(x: => Unit): Long = {
val start = System.nanoTime()
x
// Calculate how long that took and return the value.
System.nanoTime() - start
}
measureTime {
doSomething()
}
您只需执行一次该函数,并且每次所用的时间将大不相同。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句