Sto considerando l'utilizzo di Scala su un programma piuttosto impegnativo dal punto di vista computazionale. Il profiling della versione C++ del nostro codice rivela che potremmo trarre vantaggi significativi dalla valutazione Lazy. L'ho provato in Scala 2.9.1 e mi piace molto. Tuttavia, quando ho eseguito la lezione attraverso un decompilatore, l'implementazione non è sembrata corretta. Sto assumendo che si tratta di un manufatto del decompilatore, ma ho voluto ottenere una risposta più definitiva ...Si tratta di un errore nell'implementazione lenta di Scala 2.9.1 o solo un artefatto di decompilazione.
si consideri il seguente esempio banale:
class TrivialAngle(radians : Double)
{
lazy val sin = math.sin(radians)
}
quando ho decompilarlo, ottengo questo:
import scala.ScalaObject;
import scala.math.package.;
import scala.reflect.ScalaSignature;
@ScalaSignature(bytes="omitted")
public class TrivialAngle
implements ScalaObject
{
private final double radians;
private double sin;
public volatile int bitmap$0;
public double sin()
{
if ((this.bitmap$0 & 0x1) == 0);
synchronized (this)
{
if (
(this.bitmap$0 & 0x1) == 0)
{
this.sin = package..MODULE$.sin(this.radians);
this.bitmap$0 |= 1;
}
return this.sin;
}
}
public TrivialAngle(double radians)
{
}
}
Per me, il blocco di ritorno si trova nel punto sbagliato e si acquisirà sempre il blocco. Questo non può essere ciò che sta facendo il codice reale, ma non posso confermarlo. Qualcuno può confermare o negare che ho una falsa decompilazione e che l'implementazione lenta è in qualche modo ragionevole (vale a dire, solo blocchi quando calcola il valore e non acquisisce il blocco per le chiamate successive?)
Grazie!
Per riferimento, questo è il decompilatore che ho usato: http://java.decompiler.free.fr/?q=jdgui
Computazionalmente intensivo e vuoi fare le serrature? –
no, ho un sacco di elementi che voglio calcolare solo se/quando ho bisogno di loro, e vorrei che quei risultati fossero memorizzati nella cache dopo il calcolo. A seconda dell'implementazione, pigro fa esattamente quello che vorrei. Se potessi specificare nessun blocco, sarebbe ancora meglio, ma non è questo il punto di questa domanda. – fbl
Beh, ho fatto un sacco di tuning del codice C/C++/Fortran ad uso intensivo di calcolo (simulazione farmaceutica). Il metodo che uso [è questo] (http://stackoverflow.com/questions/375913/what-can-i-use-to-profile-c-code-in-linux/378024#378024). (Non si può sempre credere ai profiler, anche quando parlano chiaramente.) –