Estoy considerando usar Scala en un programa computacionalmente intensivo. El perfil de la versión C++ de nuestro código revela que podríamos beneficiarnos significativamente de la evaluación Lazy. Lo probé en Scala 2.9.1 y me gustó mucho. Sin embargo, cuando ejecuté la clase a través de un descompilador, la implementación no se veía del todo bien. Estoy asumiendo que es un artefacto de la decompilador, pero quería obtener una respuesta más concluyente ...¿Es esto un error en la implementación diferida de Scala 2.9.1 o simplemente un artefacto de descompilación?
considerar el siguiente ejemplo trivial:
class TrivialAngle(radians : Double)
{
lazy val sin = math.sin(radians)
}
cuando descompilarlo, me sale esto:
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)
{
}
}
Para mí, el bloque de retorno está en el lugar equivocado, y siempre obtendrá el bloqueo. Esto no puede ser lo que está haciendo el código real, pero no puedo confirmarlo. ¿Alguien puede confirmar o negar que tengo una descompilación falsa, y que la implementación diferida es algo razonable (es decir, solo se bloquea cuando está calculando el valor y no adquiere el bloqueo para llamadas posteriores?)
¡Gracias!
Como referencia, este es el decompilador utilicé: http://java.decompiler.free.fr/?q=jdgui
Computacionalmente intensivo y quieres estar haciendo bloqueos? –
no, tengo muchos elementos que solo quiero calcular si los necesito, y me gustaría que esos resultados se almacenaran en caché después del cálculo. Dependiendo de la implementación, perezoso hace exactamente lo que me gustaría. Si pudiera especificar ningún bloqueo, sería incluso mejor, pero ese no es el punto de esta pregunta. – fbl
Bueno, he hecho un montón de ajuste del código C/C++/Fortran computacionalmente intensivo (simulación de farma). El método que uso [es esto] (http://stackoverflow.com/questions/375913/what-can-i-use-to-profile-c-code-in-linux/378024#378024). (No siempre se puede creer en los perfiles, incluso cuando hablan con claridad.) –