Tôi đang làm việc trên một hệ thống phân tích dựa trên Scala (http://www.hiringthing.com) và tôi nhận thấy rằng tôi thường tự hỏi mình câu hỏi sau. Với một hàm "thuần" không có tác dụng phụ, nếu tôi nhấn hàm đó hai lần với cùng các đầu vào, tôi có thể mong đợi trình biên dịch sử dụng lại giá trị được tạo ra từ lần chạy đầu tiên, hoặc nó sẽ đi qua tất cả mã một lần nữa. Nói cách khác, là ví dụ đầu tiên dưới hiệu quả hơn thứ hai?Trình biên dịch Scala có hiệu quả như thế nào khi sử dụng lại các kết quả hàm đã biết?
def add(x: Int, y: Int) = x + y * 10000000000
val a = add(1,2)
do_something(a)
do_another_thing(a)
vs
def add(x: Int, y: Int) = x + y * 10000000000
do_something(add(1,2))
do_another_thing(add(1,2))
Nếu trình biên dịch thực sự có thể tối ưu hóa các trường hợp thứ hai, là có giới hạn cho sự phức tạp của hàm?
Những gì tôi muốn làm là tránh chạy toán nhất định chức năng nặng nhiều lần chỉ vì lợi ích của sự thuận tiện lập trình ...
Cảm ơn
javap có thể giúp xem nhanh mã byte được trình biên dịch tạo ra. Tôi nghi ngờ rằng mặc dù trình biên dịch hiện tại sẽ thực hiện tối ưu hóa, đơn giản vì không có monads, thật khó để xác định xem mã có bất kỳ tác dụng phụ nào không, nhưng tôi có thể sai. –