2013-02-28 27 views
5

Tại saoScala cho hiệu suất hiểu

for (
    a <- 1 to 1000; 
    b <- 1 to 1000 - a; 
    c <- 1 to 1000 - a - b; 
    if (a * a + b * b == c * c && a + b + c == 1000) 
) println((a, b, c, a * b * c)) 

266 ms

chậm hơn sau đó:

for (a <- 1 to 1000) 
    for (b <- 1 to 1000 - a) 
    for (c <- 1 to 1000 - a - b) 
     if (a * a + b * b == c * c) 
     if (a + b + c == 1000) 
      println((a, b, c, a * b * c)) 

62 ms

Nếu tôi hiểu đúng này nên giống nhau không?


Giải pháp sau khi xử lý câu trả lời:

for (
    a <- 1 to 1000; 
    b <- 1 to (1000 - a) 
) { 
    val c = (1000 - a - b) 
    if (a * a + b * b == c * c) 
    println((a, b, c, a * b * c)) 
} 

9 ms

+0

Thực sự hữu ích khi viết ít nhất phiên bản Scala bạn đã sử dụng. Tại hầu hết các hệ điều hành của bạn và các thông tin liên quan khác. –

+0

Tôi đang sử dụng một cửa sổ 7 và phiên bản 2.9.2 sử dụng nhật thực với jre7. – Jeff

+3

Cách lạ để tìm kiếm giải pháp - bạn yêu cầu 'a + b + c == 1000' vậy tại sao không chỉ đặt' c = 1000 - a - b'? (Rõ ràng đây không phải là câu trả lời cho câu hỏi ....) –

Trả lời

13

hiểu biết của bạn là sai.

for(x <- coll) if(condition) dosomething 

sẽ dịch để

coll.foreach{x => if(condition) dosomething } 

for(x <- coll if(condition)) dosomething 

mà sẽ dịch để

coll.withFilter(x => condition).foreach{ x => dosomething } 

Bạn có thể nhìn vào The Scala Language Specification 6.16 để biết thêm chi tiết.

9

Bạn có thể muốn kiểm tra this presentation (slides 13-15) để biết chi tiết về cách các vòng lặp được dịch nội bộ.

Sự khác biệt chính của ví dụ của bạn là:

  • tình trạng cho cơ thể loop (2. chẳng hạn)
  • điều kiện bên trong máy phát điện (1. ví dụ)

Sau , còn được gọi là để lọc vòng lặp đi kèm với nhược điểm hiệu suất theo thiết kế. Để cực kỳ đơn giản hóa những gì đang xảy ra: Trong vòng withFilter (là bước đầu tiên của bản dịch), chức năng mới ẩn danh của loại Function2[Object, Boolean] được tạo (được sử dụng để đánh giá điều kiện). Tham số được chuyển đến hàm apply của nó phải được đóng hộp, vì nó được xác định dựa trên Object. Điều này boxing/unboxing là chậm hơn nhiều so với việc đánh giá các điều kiện if trực tiếp trong vòng lặp for body, cho phép truy cập các biến trực tiếp.

+0

Những trang trình bày này rất thú vị ngay cả khi tìm được giải pháp tốt hơn :) – Jeff

+0

@Downvoter: Bạn có phiền không giải thích được câu trả lời của tôi sai? – bluenote10