Echt? Ok, dann wäre ich endlos dankbar zu erfahren, was ich denn hier falsch mache:- Wrapper-Objekte werden nur dann generiert, wenn sie auch notwendig sind. Wenn ich z.B. ein [c]Int[/c] zu den Elementen eines [c]Array[Int][/c] addiere, wird nichts gewrappt.
- moderne JVMs optimieren Wrapper-Zugriffe mittlerweile weg
- implizite Umwandlungen werden schon zur Compilezeit aufgelöst, ein Aufruf einer [c]Numeric[/c]-Methode ist genauso schnell wie etwa der Aufruf einer [c]java.lang.Math[/c]-Methode
Code:
object InfixWrapperTest{
trait AdditiveMonoid[A]{
def zero: A
def add(x: A, y: A): A
class Ops(x: A){
def +(y: A) = add(x, y)
}
}
implicit object DoubleIsAdditive extends AdditiveMonoid[Double]{
def zero = 0d
def add(x: Double, y: Double) = x + y
}
implicit def wrapToOps[T](x: T)(implicit monoid: AdditiveMonoid[T]): AdditiveMonoid[T]#Ops = new monoid.Ops(x)
def measuringTime[A](f: => A) = {
val t = System.currentTimeMillis
val result = f
(result, System.currentTimeMillis - t)
}
def sumGeneric[X](a: Array[X])(implicit monoid: AdditiveMonoid[X]) = {
var result = monoid.zero
var i = 0
while (i < a.length){
result += a(i)
i += 1
}
result
}
def sumDirect(a: Array[Double]) = {
var result = 0d
var i = 0
while (i < a.length){
result += a(i)
i += 1
}
result
}
def main(args: Array[String]){
val arr = new Array[Double](1000000)
for (i <- 0 until arr.size) arr(i) = math.sin(i*i + i +137)
val warmup = 200
val runs = 1000
var genericTime = 0L
var directTime = 0L
println("visueller Check der Korrektheit der Resultate:")
println(measuringTime{ sumDirect(arr) })
println(measuringTime{ sumGeneric(arr) })
println("Messung der Laufzeit")
for (i <- 1 to (warmup + runs)){
val g = measuringTime{ sumGeneric(arr) }._2
val d = measuringTime{ sumDirect(arr) }._2
if( i > warmup){
genericTime += g
directTime += d
}
println(i + "/" + (warmup + runs))
}
println("generisch: " + (genericTime.toDouble / runs) + "ms")
println("direkt: " + (directTime.toDouble / runs) + "ms")
}
}
Code:
generisch: 82.383ms
direkt: 5.298ms
Edit (Illuvatar): Abgetrennt aus diesem Post
Zuletzt bearbeitet von einem Moderator: