2011-01-26 14 views
7

Aktörler ile almayı kullanırken kullanırken döngü yerine (gerçek) fark nedir. Loop daha hızlı çalışıyor, ama neden ve kaputun altında neler oluyor?Scala oyuncularıyla iken (gerçek) döngü kullandığımızda ne olur?

Döngü kullanmak yerine kötü bir şey var mı (gerçek)?

Bağlam hakkında daha fazla bilgi. Basit ping/pong kodunda performans testleri yapıyorum. Ve ben alıyorum.

yerine süre içinde
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() 
     } 
    } 
}}} 

(doğru) o döngü ile daha iyi performans:

Bu Ping sınıftır.

sayesinde

cevap

3

, while değil iken. Yani, eğer birçok aktör kullanıyorsanız, loop kullanımı daha verimli hale gelir. Diğer taraftan, while ve receive kullanarak tek bir aktör, bir loop ve react (veya bu konuda, loop ve receive) kullanılarak çok daha hızlıdır.

+0

Yani alma veya reaksiyonun iş parçacığı üzerinde herhangi bir etkisi olmadığı anlamına gelir. "while" ve "loop" anahtar kelimeleri threadleri kontrol ediyor. – Zerdush

+0

@Zerdush Hayır, "döngü" ve "tepki" iş parçacığı üzerinde bir etkiye sahip - her ikisi de onu serbest bırakır. Ne "ne" ne ne de "alma" iş parçacığını serbest bırakmaz. –

4

while/receive döngü blocks a thread, loop/react yapı bunu yapmaz. Bu, ilk yapının, aktör başına bir iplikçiye ihtiyaç duyduğu ve bu da hızlı bir şekilde yavaşladığı anlamına gelir. Haller and Odersky 2006 göre

,

bir alma açıklamada bekler Bir aktör bir bloke parçacığı tarafından değil aktörün hesaplama kalanını yakalar bir kapatma tarafından temsil edilmez. Kapama, alıcıda mesajına, mesajda belirtilen mesajlarından biriyle eşleşen bir mesaj gönderildiğinde çalıştırılır. Kapağın yürütülmesi, gönderenin iş parçacığında "piggy destekli" dir. Kapanış sona ererse, bir yordamın geri döndüğü gibi göndericiye kontrol döndürülür. alıcı kapama bloğu, bir ikinci kez alınıyorsa, denetleyici, alıcının çağrı kümesini çözen özel bir istisnası atanarak göndericiye döndürülür.

(Anlaşılan sonradan receive davranışını değiştirdi ve react eski receive değiştirildi.) loop bültenleri diğer görevlere iplik kullanma

+0

Ama tepki ile almayla ilmek hakkında konuşuyorum. While/receive ve loop/receive arasındaki fark nedir? Döngü/alma kullanarak herhangi bir sorun var mı? Daha hızlı görünüyor. – Zerdush

İlgili konular