Comment detail

分散関数呼び出し (Nested Flatten)

ScalaでActorを使って。

そもそも非同期に使うのがメインなものなので、同期でやるなんて初めてでした。!?とreplyを使うと同期でメッセージを送受信できます。

が・・・直列で使うと遅いですね。

  • CPU:Athlon 3000+
  • RAM: 1G
  • 同一ホスト

で21218 msでした。直列に呼び出すなら素直にRMI使ったほうがいいですね。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import scala.actors._
import scala.actors.Actor._
import scala.actors.remote._
import scala.actors.remote.RemoteActor._
import java.io.ByteArrayOutputStream

val PORT = 9010

if(args.length>0 && args(0) == "server") {
//server side

  println("server:start")
  actor {
    alive(PORT)
    register('pricestring, self)
    loop {
      react{ 
        case (price:int, p:int) => 
          val s = new ByteArrayOutputStream
          Console.withOut[unit](s){
            printf("\u8ca9\u58f2\u4fa1\u683c {0}\u5186\uff08\u5b9a\u4fa1{1}\u5186\u304b\u3089{2}%\u5f15\u304d\uff09",
              (price*(1-p.toFloat/100)).ceil, price, p)
          }
          reply(s.toString)
      }
    }
  }

}else {
//client side

  val clientActor = actor {
    val c = select(Node("127.0.0.1", PORT), 'pricestring)
    loop {
      react {
        case r@(i:int,j:int) => reply((c!?r))
      }
    }
  }

  import scala.testing.Benchmark
  val test = new Benchmark {
    def run:unit = {
      var i = -1;while({i= i+1; i<10000}) {
        clientActor !? ((2000, 20))
      }
      return ()
    }
  }
  println(test.runBenchmark(1)(0)+" ms")
  System.exit(0)
}

Index

Feed

Other

Link

Pathtraq

loading...