Tôi đang xem xét sử dụng Scala trên một chương trình khá tính toán chuyên sâu. Việc biên dịch phiên bản C++ của mã của chúng tôi cho thấy rằng chúng ta có thể hưởng lợi đáng kể từ việc đánh giá Lười biếng. Tôi đã thử nó trong Scala 2.9.1 và thực sự thích nó. Tuy nhiên, khi tôi chạy lớp thông qua một trình biên dịch ngược, việc thực hiện không hoàn toàn đúng. Tôi giả định rằng nó là một artifact của decompiler, nhưng tôi muốn để có được một câu trả lời thuyết phục hơn ...Đây có phải là một lỗi trong Scala 2.9.1 lười biếng thực hiện hoặc chỉ là một tạo tác của decompilation
xem xét ví dụ tầm thường như sau:
class TrivialAngle(radians : Double)
{
lazy val sin = math.sin(radians)
}
khi tôi biên soạn lại nó, tôi có được điều này:
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)
{
}
}
Với tôi, khối trả về nằm sai chỗ và bạn sẽ luôn có khóa. Đây không thể là mã thực sự đang làm, nhưng tôi không thể xác nhận điều này. Bất cứ ai có thể xác nhận hoặc phủ nhận rằng tôi có một sự giải mã không có thật, và việc thực hiện lười biếng có phần hợp lý (nghĩa là, chỉ khóa khi nó tính toán giá trị, và không có khóa cho các cuộc gọi tiếp theo?)
Cảm ơn!
Để tham khảo, đây là decompiler tôi đã sử dụng: http://java.decompiler.free.fr/?q=jdgui
Tính chuyên sâu và bạn muốn làm ổ khóa? –
không, tôi có rất nhiều mục mà tôi chỉ muốn tính nếu/khi tôi cần chúng, và tôi muốn các kết quả đó được lưu trữ sau khi tính toán. Tùy thuộc vào việc thực hiện, lười biếng không chính xác những gì tôi muốn. Nếu tôi có thể chỉ định không khóa, điều đó thậm chí sẽ tốt hơn, nhưng đó không phải là điểm của câu hỏi này. – fbl
Tôi đã thực hiện rất nhiều điều chỉnh mã C/C++/Fortran chuyên sâu tính toán (mô phỏng dược phẩm). Phương pháp tôi sử dụng [là này] (http://stackoverflow.com/questions/375913/what-can-i-use-to-profile-c-code-in-linux/378024#378024). (Bạn không thể lúc nào cũng tin vào các trình biên dịch, ngay cả khi họ nói rõ ràng.) –