底線是,你將不得不爲自己的應用程序自己測量它,看它是否重要。您可以通過當前的JVM獲得相當違反直覺的結果。嘗試一下。
文件TraitAbstractPackage.scala
package traitvsabstract
trait T1 { def x: Int; def inc: Unit }
trait T2 extends T1 { def x_=(x0: Int): Unit }
trait T3 extends T2 { def inc { x = x + 1 } }
abstract class C1 { def x: Int; def inc: Unit }
abstract class C2 extends C1 { def x_=(x0: Int): Unit }
abstract class C3 extends C2 { def inc { x = x + 1 } }
文件TraitVsAbstract.scala
object TraitVsAbstract {
import traitvsabstract._
class Ta extends T3 { var x: Int = 0}
class Tb extends T3 {
private[this] var y: Long = 0
def x = y.toInt
def x_=(x0: Int) { y = x0 }
}
class Tc extends T3 {
private[this] var xHidden: Int = 0
def x = xHidden
def x_=(x0: Int) { if (x0 > xHidden) xHidden = x0 }
}
class Ca extends C3 { var x: Int = 0 }
class Cb extends C3 {
private[this] var y: Long = 0
def x = y.toInt
def x_=(x0: Int) { y = x0 }
}
class Cc extends C3 {
private[this] var xHidden: Int = 0
def x = xHidden
def x_=(x0: Int) { if (x0 > xHidden) xHidden = x0 }
}
def Tbillion3(t: T3) = {
var i=0; while (i<1000000000) { t.inc; i+=1 }; t.x
}
def Tbillion1(t: T1) = {
var i=0; while (i<1000000000) { t.inc; i+=1 }; t.x
}
def Cbillion3(c: C3) = {
var i=0; while (i<1000000000) { c.inc; i+=1 }; c.x
}
def Cbillion1(c: C1) = {
var i=0; while (i<1000000000) { c.inc; i+=1 }; c.x
}
def ptime(f: => Int) {
val t0 = System.nanoTime
val ans = f.toString
val t1 = System.nanoTime
printf("Answer: %s; elapsed: %.2f seconds\n",ans,(t1-t0)*1e-9)
}
def main(args: Array[String]) {
for (i <- 1 to 3) {
println("Iteration "+i)
val t1s,t3s = List(new Ta, new Tb, new Tc)
val c1s,c3s = List(new Ca, new Cb, new Cc)
t1s.foreach(x => ptime(Tbillion1(x)))
t3s.foreach(x => ptime(Tbillion3(x)))
c1s.foreach(x => ptime(Cbillion1(x)))
c3s.foreach(x => ptime(Cbillion3(x)))
println
}
}
}
每個人都應該打印出10億的答案,而且所花費的時間應該是零(如果JVM是很聰明)或約需要添加十億個數字。但至少在我的系統中,Sun JVM向後優化 - 重複運行速度變慢 - 而抽象類比特性慢。 (你可能想用java -XX:+PrintCompilation
來試圖弄清楚出了什麼問題;我懷疑是殭屍)。
另外,值得注意的是scalac -optimise沒有任何改進的地方 - 這一切都取決於JVM。
相比之下,JRockit JVM的性能始終如一,但同樣,特質擊敗了類。由於時間是一致的,我會報告他們:3.35s的類(3.62s爲一個if語句)與2.51秒的所有特性,if語句或否。 (我發現這種趨勢總體上是真實的:在某些情況下,熱點產生快速的性能,而在其他情況下(例如這種情況),會變得困惑並且非常慢; JRockit從不超速 - 不要打擾試圖從原語中獲得類似C的性能 - 但它很少出現錯誤)。
如果您正在認真考慮這種低級優化,那麼您正在使用錯誤的編程語言。 – Raphael 2011-02-10 21:37:48
@Raphael如果您在Android系統或類似系統上使用Scala,您可能需要注意所有那些您通常不會重複考慮的事情。 – wheaties 2011-02-10 21:54:59