2011-01-26 16 views
7

Sự khác biệt của việc sử dụng vòng lặp thay vì trong khi (true) khi sử dụng nhận được với các tác nhân. Vòng lặp dường như hoạt động nhanh hơn nhiều, nhưng tại sao, và những gì đang xảy ra dưới nắp ca-pô?Điều gì sẽ xảy ra khi chúng ta sử dụng vòng lặp thay vì trong khi (đúng) với các diễn viên scala?

Có điều gì xấu để sử dụng vòng lặp thay vì trong khi (đúng) không?

Tìm hiểu thêm về ngữ cảnh. Tôi đang thực hiện các thử nghiệm hiệu suất trong mã ping/pong đơn giản. Và tôi đang sử dụng nhận.

Đây là lớp Ping:

class ReceivePing(
     count : Int, 
     pong : Actor 
     ) extends Actor {def act() { 
var pingsLeft = count - 1 
pong ! Start 
pong ! ReceivePing 
while(true) { 
    receive { 
    case ReceivePong => 
     if (pingsLeft % 10000 == 0) 
     Console.println("ReceivePing: pong") 
     if (pingsLeft > 0) { 
     pong ! ReceivePing 
     pingsLeft -= 1 
     } else { 
     Console.println("ReceivePing: stop") 
     pong ! Stop 
     exit() 
     } 
    } 
}}} 

thay vì while (true) nó thực hiện tốt hơn với vòng lặp.

Cảm ơn

Trả lời

3

Sử dụng loop phiên thread để các nhiệm vụ khác, trong khi while không. Vì vậy, nếu bạn đang sử dụng nhiều diễn viên, việc sử dụng loop sẽ làm cho hiệu quả hơn. Mặt khác, một diễn viên sử dụng whilereceive nhanh hơn nhiều so với sử dụng loopreact (hoặc, cho rằng vấn đề, loopreceive).

+0

Vì vậy, nó có nghĩa là nhận được hoặc phản ứng không có bất kỳ tác động trên thread. "trong khi" và "vòng lặp" từ khóa đang kiểm soát các chủ đề. – Zerdush

+0

@ Zerdush Không, 'loop' và' react' có tác động lên luồng - cả hai đều giải phóng nó. Cả 'while' lẫn' receive' đều không giải phóng luồng. –

4

Các while/receive loop blocks a thread, trong khi loop/react xây dựng thì không. Điều này có nghĩa là cấu trúc đầu tiên cần một luồng cho mỗi tác nhân, nhanh chóng trở nên chậm.

Theo Haller and Odersky 2006,

Một diễn viên mà chờ đợi trong một tuyên bố nhận không được đại diện bởi một sợi chặn nhưng bởi một kết thúc mà nắm bắt được phần còn lại của tính toán của diễn viên. Việc đóng cửa được thực hiện khi thông báo được gửi đến diễn viên khớp với một trong các mẫu thông báo được nhận trong thông báo nhận. Việc thực hiện đóng cửa là "hỗ trợ heo con" trên luồng của người gửi. Nếu đóng cửa nhận chấm dứt, điều khiển được trả lại cho người gửi như thể một thủ tục trả về. Nếu khối đóng nhận được trong một lần nhận giây, điều khiển được trả lại cho người gửi bằng cách ném một trường hợp đặc biệt để giải phóng ngăn xếp cuộc gọi của người nhận.

(Rõ ràng họ sau đó đổi hành vi của receive và đổi tên thành cũ receive để react.)

+0

Nhưng tôi đang nói về vòng lặp nhận được không có phản ứng. Sự khác biệt giữa thời gian/nhận và vòng lặp/nhận là gì? Có bất kỳ vấn đề sử dụng vòng lặp/nhận? Nó có vẻ nhanh hơn. – Zerdush

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