Disadvantages of Immutable objects说:
不可变类的缺点是它们的实例需要首先复制,而可以在其位置进行更新。
这意味着使用一个巨大且不变的对象运行同一进程可能比同一可变对象具有更差的性能,对吗?
这是有道理的,因为每次操作不可变对象时,都需要事先对其进行复制。
[hadoop@nn1 scala]$ cat Im.scala
// Im.scala
object Im extends App {
val valBigInt: BigInt = 999999999999999999L
var varBigIntTmp: BigInt = 0L
for(i<- 1L to 99999999L) {
varBigIntTmp = valBigInt.flipBit(0)
}
}
[hadoop@nn1 scala]$ cat M.scala
// M.scala
object M extends App {
var varBigInt: BigInt = 999999999999999999L
var varBigIntTmp: BigInt = 0L
for(i<- 1L to 99999999L) {
varBigIntTmp = varBigInt.flipBit(0)
}
}
我不停地解释他们两次。
Im.scala始终比M.scala消耗更少的“实时”。
例如,
[hadoop @ nn1 scala] $时间scala Im.scala
真实0m8.878s
用户0m12.228s
sys 0m1.940s
[hadoop @ nn1 scala] $时间scala M.scala
真实0m9.890s //大于Im.scala的实时时间(8.878s)
用户0m14.070s
sys 0m1.383s
似乎不可变对象没有上述缺点,为什么?