ho riscontrato questo problema, mentre a fare i compiti da Coursera "scala di specializzazione" (questo è semplificata la versione e non contiene alcun dettaglio compiti a casa, è solo attraversamento serie)Scala modello di prestazioni corrispondenti
val chars: Array[Char] = some array
def fun1(idx:Int):Int = {
some code here (including the stop condition)
val c = chars(idx)
c match{
case '(' => fun1(idx+1)
case _ => fun1(idx+1)
}
}
Questo codice è 4 volte più lento di
def fun2(idx: Int):Int = {
some code here (including the stop condition)
val c = chars(idx)
(c == '(') match{
case true => fun2(idx+1)
case _ => fun2(idx+1)
}
}
Tutto quello che sto facendo sta cambiando il pattern matching (io sono in esecuzione utilizzando ScalMeter così credo nelle statistiche).
Qualcuno può spiegare questo comportamento?
Vorrei dubitare che questo sia un metodo di benchmark tutt'altro che valido. A ScalaMeter piace fare un paio di dozzine di scaldini finché i risultati non si stabilizzano. Non hai nemmeno provato a usare gli stessi dati. –
Sì, non gli stessi dati. Ma sto ottenendo risultati piuttosto vicini tra le piste. Lo stddev è estremamente basso, il che suggerisce che se avessi usato gli stessi dati, non avrei visto molta differenza. Come accennato nella risposta, ho fatto anche dei warm up, quindi non sono sicuro di quale sia il parametro di riferimento che trovi "non valido". Resto fermo alle mie scoperte e ti sfido a confutarle in modo definitivo (e riproducibile) se puoi. – Dima
Prendendo in prestito le tue funzioni, ecco il benchmark con scala meter: https://gist.github.com/lukaszwawrzyk/a2505d5b3083bb72de51b8445fbb9a76 Dare tempo char: 13.172258374999998 ms' e 'bool time: 4.739404575 ms'. È fatto per gli array come nella domanda, se l'uso di un seq indicizzato i risultati sono effettivamente più vicini ma non uguali (95 secondi contro 80 secondi) –