Io corro il seguente codice Scala:Perché questo codice Scala è lento?
import scala.util.parsing.json._
import scala.io._
object Main {
def jsonStringMap(str: String) =
JSON.parseFull(str) match {
case Some(m: Map[_,_]) => m collect {
// If this doesn't match, we'll just ignore the value
case (k: String, v: String) => (k,v)
} toMap
case _ => Map[String,String]()
}
def main(args: Array[String]) {
val fh = Source.fromFile("listings.txt")
try {
fh.getLines map(jsonStringMap) foreach { v => println(v) }
} finally {
fh.close
}
}
}
Sulla mia macchina ci vogliono ~ 3 minuti sul file da http://sortable.com/blog/coding-challenge/. I programmi equivalenti di Haskell e Ruby che ho scritto prendono meno di 4 secondi. Che cosa sto facendo di sbagliato?
Ho provato lo stesso codice senza la mappa (jsonStringMap) ed era molto veloce, quindi il parser JSON è davvero lento?
Sembra probabile che il parser JSON predefinito sia solo molto lento, tuttavia ho provato con lo https://github.com/stevej/scala-json e anche se questo scende a 35 secondi, è ancora molto più lento di Ruby.
Ora sto usando https://github.com/codahale/jerkson che è ancora più veloce! Il mio programma ora viene eseguito in soli 6 secondi sui miei dati, solo 3 secondi più lentamente di Ruby, che probabilmente è l'avvio della JVM.
forse un adattamento migliore per codereview.stackexchange.com – Nettogrof
A mano libera, sembra che si stia analizzando ogni riga in modo indipendente. Hai provato a invocare il parser una volta per l'intero documento JSON? –
@ChrisShain Potrei convertire tutto il file in un documento JSON, ma (a) non vedo come sarebbe più veloce, perché non è possibile eseguire lo streaming delle righe dal file, ma dovrebbe fare tutto contemporaneamente (b) perché fare la stessa cosa che sta facendo in Ruby è molto più veloce? – singpolyma