꽤 계산 집약적 인 프로그램에서 스칼라를 사용할 것을 고려하고 있습니다. 코드의 C++ 버전을 프로파일 링하면 Lazy 평가를 통해 상당한 이점을 얻을 수 있다는 것을 알 수 있습니다. 나는 Scala 2.9.1에서 그것을 시도해 보았고 실제로 그것을 좋아했다. 그러나 클래스를 디 컴파일러를 통해 실행할 때 구현이 올바르게 보이지 않았습니다. 나는 그것을 디 컴파일 할 때이것은 스칼라 2.9.1 지연 구현의 버그 또는 디 컴파일의 인공물입니까
class TrivialAngle(radians : Double)
{
lazy val sin = math.sin(radians)
}
, 나는이 얻을 : 다음과 같은 사소한 예를 살펴 ...
을 나는 그것이 디 컴파일러의 유물의 있으리라 믿고있어,하지만 난 더 확실한 답을 얻고 싶었다 :
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)
{
}
}
저에게있어, 반환 블록은 잘못된 위치에 있으며, 항상 잠금을 획득하게됩니다. 이것은 실제 코드가 수행 할 수는 없지만이를 확인할 수는 없습니다. 누구나 내가 가짜 역 컴파일을했다는 것을 확인하거나 부인할 수 있습니까? 그리고 게으른 구현은 다소 합리적입니다 (즉, 값을 계산할 때만 잠그고 후속 호출에 대해 잠금을 얻지 못합니다).
고마워요! http://java.decompiler.free.fr/?q=jdgui
전산 집중적으로 자물쇠를하고 싶습니까? –
아니요, 필요한 경우에만 계산할 항목이 많아서 계산 결과를 캐시에 저장하고 싶습니다. 구현에 따라 lazy는 내가 원하는 것을 정확하게 수행합니다. 잠금을 지정하지 않으면 더 좋을 것입니다.하지만이 질문의 핵심은 아닙니다. – fbl
글쎄, 나는 계산 집약적 인 C/C++/Fortran 코드 (제약 시뮬레이션)에 대해 많은 조정을 해왔다. 내가 사용하는 방법은 [This is] (http://stackoverflow.com/questions/375913/what-can-i-use-to-profile-c-code-in-linux/378024#378024)입니다. (당신이 항상 명확하게 말하더라도, 프로파일 러를 항상 믿을 수는 없습니다.) –