2011-01-26 8 views
7

アクターでreceiveを使用しているときに、while(true)ではなくloopを使用する点の違いは何ですか?ループははるかに速く動作するようですが、なぜ、そしてボンネットの下で何が起こっていますか?while(true)の代わりにloopを使ってスカラーアクターを使うとどうなりますか?

while(真)ではなくloopを使用するのは悪いですか?

コンテキストの詳細。シンプルなping/pongコード内でパフォーマンステストを行っています。そして、私は受信を使用しています。

これは、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() 
     } 
    } 
}}} 

代わりに、一方(真)には、ループとのより良い行います。

おかげ

答えて

3

loopリリースにスレッドを使用して他のタスクに、whileはそうではありません。したがって、多くのアクターを使用している場合は、loopを使用するとより効率的になります。一方、whilereceiveを使用する1人の俳優は、loopreact(またはそのためにはloopreceive)を使用する俳優よりもはるかに高速です。

+0

それは受信または反応がスレッドに影響を与えないことを意味します。 "while"と "loop"キーワードはスレッドを制御しています。 – Zerdush

+0

@Zerdushいいえ、 'loop'と' react'はスレッドに影響を与えます - 両方とも解放します。 'while'も' receive'もスレッドを解放しません。 –

4

while/receiveループblocks a threadloop/react構築物がないのに対し。これは、最初のコンストラクタがアクタごとに1つのスレッドを必要とし、すぐに遅くなることを意味します。 Haller and Odersky 2006によると

受信 文が ブロックされたスレッドではなく は俳優の 計算の残りの部分をキャプチャするクロージャで表現されていないで待機俳優。受信に指定されたメッセージ の1つに一致するメッセージがアクタ に送信されると、クロージャが実行されます。 クロージャの実行は、送信者のスレッド上で「ピギーバック」されます。 受信クロージャ が終了した場合は、手順が戻るかのように、送信者 に制御が戻されます。 秒の受信クロージャブロックが受信すると、受信者の 呼び出しスタックを巻き戻す特別な 例外をスローすることによって、送信者に送信者 の制御が返されます。

(どうやら彼らは後にreceiveの振る舞いを変更し、reactに古いreceiveの名前を変更しました。)

+0

しかし、私は反応がない受信とループについて話しています。 while/receiveとloop/receiveの違いは何ですか?ループ/受信の使用に問題はありますか?それはより速く見える。 – Zerdush

関連する問題