一点背景:
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 to 1000000).foreach(_ => processFingerOnly(johnFinger))
和
(1 to 1000000).foreach(_ => processHumanFinger(john))
我的问题主要是关于知道在分配{{1}时,深入访问人类对象一百万次(样本2)的成本(时间和/或内存)是否比深入访问它更昂贵(时间和/或内存)然后只将val johnFinger
对象传递给函数(示例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
}
time {(1 to 10000000).foreach(_ => processFingerOnly(johnFinger))}
time {(1 to 10000000).foreach(_ => processHumanFinger(john))}
通过这个简单的计时器,我们可以看到访问1级对象的速度大约是访问4级对象的两倍。
然而,这可能是一种愚蠢的方法,所以我很高兴听到人们的意见并随时编辑!