J'envisage d'utiliser Scala sur un joli programme de calcul intensif. Le profilage de la version C++ de notre code révèle que nous pourrions bénéficier de manière significative de l'évaluation paresseuse. Je l'ai essayé dans Scala 2.9.1 et l'aime vraiment. Cependant, quand j'ai couru la classe à travers un décompilateur, la mise en œuvre ne semblait pas très bien. Je suppose que c'est un artefact de la décompilateur, mais je voulais obtenir une réponse plus concluante ...Est-ce un bug dans Scala 2.9.1 mise en œuvre paresseuse ou juste un artefact de décompilation
considérer l'exemple trivial suivant:
class TrivialAngle(radians : Double)
{
lazy val sin = math.sin(radians)
}
quand je décompiler, je reçois ceci:
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)
{
}
}
Pour moi, le bloc de retour est au mauvais endroit, et vous obtiendrez toujours le verrou. Cela ne peut pas être ce que fait le vrai code, mais je suis incapable de le confirmer. Est-ce que quelqu'un peut confirmer ou nier que j'ai une fausse décompilation, et que l'implémentation paresseuse est quelque peu raisonnable (ie, verrouille uniquement quand elle calcule la valeur, et n'acquiert pas le verrou pour les appels suivants?)
Merci!
Pour référence, c'est le décompilateur je: http://java.decompiler.free.fr/?q=jdgui
Vous travaillez intensivement et vous voulez faire des verrous? –
non, j'ai beaucoup d'éléments que je veux seulement calculer si/quand j'ai besoin d'eux, et je voudrais que ces résultats mis en cache après le calcul. Selon la mise en œuvre, paresseux fait exactement ce que je voudrais. Si je ne pouvais pas spécifier de verrouillage, ce serait encore mieux, mais ce n'est pas le but de cette question. – fbl
Eh bien, j'ai fait beaucoup de réglage de code C/C++/Fortran intensif en calcul (simulation pharma). La méthode que j'utilise [est ceci] (http://stackoverflow.com/questions/375913/what-can-i-use-to-profile-c-code-in-linux/378024#378024). (Vous ne pouvez pas toujours croire les profileurs, même s'ils parlent clairement.) –