biegnę następujący kod Scala:Dlaczego ten kod Scala jest wolny?
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
}
}
}
Na moim komputerze trwa około 3 minut na pliku z http://sortable.com/blog/coding-challenge/. Odpowiednik programów Haskell i Ruby, które napisałem, trwa poniżej 4 sekund. Co ja robię źle?
Próbowałem tego samego kodu bez mapy (jsonStringMap) i było szybko, więc czy parser JSON jest naprawdę wolny?
Wydaje się prawdopodobne, że domyślny analizator składni JSON jest po prostu bardzo powolny, jednak spróbowałem https://github.com/stevej/scala-json, a podczas gdy osiągnie to 35 sekund, to nadal jest znacznie wolniejsze niż Ruby.
Używam teraz https://github.com/codahale/jerkson, który jest jeszcze szybszy! Mój program działa teraz tylko 6 sekund na moich danych, tylko 3 sekundy wolniej niż Ruby, co jest prawdopodobnie tylko uruchomieniem JVM.
może lepiej pasuje do codereview.stackexchange.com – Nettogrof
Z drugiej strony wygląda na to, że analizujesz każdą linię niezależnie. Czy próbowałeś raz wywołać analizator składni dla całego dokumentu JSON? –
@ChrisShain Mógłbym przekształcić cały plik w dokument JSON, ale (a) nie widzę, jak to by było szybciej, ponieważ nie może przesyłać strumieniowo linii z pliku nawet, ale musiałby zrobić to wszystko od razu (b) dlaczego robienie tego samego, co robi w Ruby, jest o wiele szybsze? – singpolyma