在Scala中访问对象的成本

时间:2017-08-31 15:05:39

标签: performance scala

一点背景:

case class Finger(length: Int)
case class Arm(thumb: Finger)
case class Body(rightArm: Arm, leftArm: Arm)
case class Human(body: Body)

def processHumanFinger(human: Human) = println(human.body.rightArm.thumb.length)

def processFingerOnly(finger: Finger) = println(finger.length)

val john = Human(Body(Arm(Finger(1)), Arm(Finger(3))))
val johnFinger = john.body.rightArm.thumb.length

我想知道这两段代码之间的内存和时间成本差异是什么:

样本1

(1 to 1000000).foreach(_ => processFingerOnly(johnFinger))

样本2

(1 to 1000000).foreach(_ => processHumanFinger(john))

我的问题主要是关于知道在分配{{1}时,深入访问人类对象一百万次(样本2)的成本(时间和/或内存)是否比深入访问它更昂贵(时间和/或内存)然后只将val johnFinger对象传递给函数(示例1)。但我对这两段代码之间存在的各种差异感兴趣!

1 个答案:

答案 0 :(得分:0)

使用以下代码,您可以检查每个样本的使用时间。

<强>制备

case class Finger(length: Int)
case class Arm(thumb: Finger)
case class Body(rightArm: Arm, leftArm: Arm)
case class Human(body: Body)

def processHumanFinger(human: Human) = human.body.rightArm.thumb.length
def processFingerOnly(finger: Finger) = finger.length

val john = Human(Body(Arm(Finger(1)), Arm(Finger(3))))
val johnFinger = john.body.rightArm.thumb.length

def time[R](block: => R): R = {
    val t0 = System.nanoTime()
    val result = block    // call-by-name
    val t1 = System.nanoTime()
    println("Elapsed time: " + (t1 - t0) + "ns")
    result
}

样本1

time {(1 to 10000000).foreach(_ => processFingerOnly(johnFinger))}

样本2

time {(1 to 10000000).foreach(_ => processHumanFinger(john))}

通过这个简单的计时器,我们可以看到访问1级对象的速度大约是访问4级对象的两倍。

然而,这可能是一种愚蠢的方法,所以我很高兴听到人们的意见并随时编辑!