我正在考慮在一個相當計算密集的程序上使用Scala。剖析我們的代碼的C++版本顯示,我們可以從懶惰評估中獲益很多。我已經在Scala 2.9.1中試過了,並且非常喜歡它。但是,當我通過反編譯器運行該類時,實現看起來不太正確。我假設它的反編譯器的假象,但我想獲得更確鑿的答案...這是Scala 2.9.1中的一個bug懶惰的實現還是隻是一個反編譯的工件
考慮以下簡單的例子:
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
計算密集型,你想要做鎖嗎? –
不,我有很多項目,我只想計算,如果/當我需要他們,我想這些結果緩存計算後。根據實施情況,懶惰正是我想要的。如果我可以指定不鎖定,那會更好,但這不是這個問題的關鍵。 – fbl
那麼我已經做了大量的計算密集型C/C++/Fortran代碼調整(製藥仿真)。我使用的方法[是這個](http://stackoverflow.com/questions/375913/what-can-i-use-to-profile-c-code-in-linux/378024#378024)。 (即使講清楚,你也不能總是相信分析器。) –