challenge 分散関数呼び出し

分散関数呼び出しを実装してください.

呼び出される関数は,定価を整数で,割引率(%)を整数で受け取り,
文字列で「販売価格 ○円(定価○円から○%引き)」を返すものとします.
また,数字は3桁のカンマ区切りにするものとします.

たとえば,pricestring(2000, 20) なら
"販売価格 1,600円 (定価2,000円から20%引き)"
を返します.

関数の呼び出し元と,呼び出される側は,物理的に異なる
サーバに配置できることを条件とします.
呼び出し方法は問いませんが,呼び出し方法に名前がある場合,
それをタグに加えてください.
(XML-RPC,SOAP,CORBA,RMI,など)

また,作成した関数を直列に1万回呼び出して,
実行にかかった時間を測定してください.
測定時は別サーバでなくても構いません.
(なるべく別サーバが望ましいです)

測定環境として,
・サーバとクライアントのCPU・メモリ
・同一サーバ内での実行か別サーバでの実行か
・別サーバの場合,通信経路.(100Mbps Ethernet等)
・言語のバージョン
・ミドルウェアを使用している場合,その名前とバージョン
も併記してください.

1つの言語で複数の分散関数呼び出しの実装方法がある場合,
複数の回答を歓迎します.

出題の意図は,様々な分散呼び出し方法の実装例と,
レスポンス速度の確認にあります.
このお題は沢渡 みかげさんの投稿です。 まったく手を加えないでいい完成度の投稿で本当に助かります。 ありがとうございました。

Posted feedbacks - Scala

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...