2012-02-25 31 views
5

Trong rất nhiều trường hợp với Scala, chẳng hạn như đơn giản, địa phương phạm vi chức năng invocations, người ta có thể tưởng tượng rằng nó thường sẽ là về mặt lý thuyết có thể thoát khỏi đối tượng chức năng hoàn toàn. Nhưng AFAIK, JVM không biết làm thế nào để làm điều này, và tôi không nghĩ rằng Scala làm một trong hai. Chính xác?Scala (hoặc JVM) có bao giờ tối ưu hóa các đối tượng (Chức năng) không?

Các đối tượng chức năng ẩn danh luôn được đóng dấu? Nếu không, có một giới hạn khá khó khăn về bao nhiêu nội tuyến có thể được thực hiện. Chính xác?

Có ai biết về bất kỳ nỗ lực được lên kế hoạch nào có khả năng giải quyết các loại tối ưu hóa này không?

Xem thêm các thuần Java câu hỏi liên quan: Does a modern JVM optimize simple inline anonymous class allocation?

(Tụng của "không tối ưu hóa quá sớm", "nó không quan trọng", et al là rất dôi dư tại thời điểm này và không hữu ích.)

+1

Bạn có ý gì khi loại bỏ các đối tượng chức năng? Bạn có nghĩa là mã của họ được gạch chân không? Hoặc sau khi mã được gạch chân, đối tượng giữ chức năng là rác được thu thập? – Bill

+0

@Bill, xin lỗi vì không rõ ràng. Tôi có nghĩa là không bao giờ tạo ra các đối tượng ở tất cả. Trong nhiều trường hợp, đặc biệt là đối với các hàm cục bộ ẩn danh, nó có hiệu quả không trạng thái và phương thức áp dụng có hiệu quả tĩnh. –

Trả lời

5

Phân tích nội tuyến và thoát có thể làm chính xác điều đó. Bạn có thể chứng minh điều này cho chính mình nếu bạn sử dụng các báo cáo tổng hợp trong JVM 7, hoặc chuẩn hai đoạn mã sau đây:

def rfor(i0: Int, i1: Int)(f: Int => Unit) { 
    var i = i0 
    while (i <= i1) { 
    f(i) 
    i += 1 
    } 
} 

def whiley = { 
    var s = 0 
    var n = 1 
    while (n <= 500000000) { 
    val k = n >> 2 
    var i = 1 
    while (i <= 2) { 
     s += i*k 
     i += 1 
    } 
    n += 1 
    } 
    s 
} 

def rfory = { 
    var s = 0 
    var n = 0 
    while (n <= 500000000) { 
    val k = n >> 2 
    rfor(1, 2){ s += k * _ } 
    n += 1 
    } 
    s 
} 

Trên máy tính của tôi, điều thứ hai là ít nhất càng nhanh càng tốt là người đầu tiên (đôi khi nhanh hơn), mặc dù thứ hai dường như đòi hỏi một chức năng tạo ra mỗi lần lặp lại khác.

Các vấn đề liên quan