challenge 分散関数呼び出し

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

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

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

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

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

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

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

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

Posted feedbacks - Haskell

Gaucheのコードを見て思いついた。
サーバー側の  ghci を ssh で起こす。
自宅のクライアントプログラムからインターネットにあるサーバーへアクセスして
pricestring を 10000回実行、結果の文字列10000行をプログラムで受けとる。 
 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
53
54
55
56
57
58
59
-- サーバー側 pricestring.hs

import qualified Data.UTF8 as U
import Data.List

pricestring :: Int -> Int -> String
pricestring x y = "販売価格 "++h++" 円 (定価 "++t++" 円から "++r++" %引き)"
  where  h = comint (x*(100-y) `div` 100)
         t = comint x 
         r = comint y

comint :: Int -> String
comint = reverse . concat . intersperse "," . slice 3 . reverse . show

slice :: Int -> [a] -> [[a]]
slice n = unfoldr phi
   where phi [] = Nothing
         phi xs = Just $ splitAt n xs

-- クライアント側

module Main (main) where

import Data.List
import Data.Char
import qualified Data.UTF8 as U
import System.IO
import System.Process

remote = "foo.example.org"

main :: IO ()
main = do { (i,o,e,p) <- runInteractiveCommand "ssh "++host++" ghci -v0 pricestring.hs"
          ; cs <- hGetContents o
          ; es <- hGetContents e
          ; hPutStrLn i "U.putStr $ unlines $ map (uncurry pricestring) $ replicate 10000 (2000,20)"
          ; hFlush i
          ; hPutStrLn i ":q"
          ; hFlush i
          ; putStr cs
          ; putStr es
          }

loop0 h = do { l <- getLine
            ; if "> " `isSuffixOf` l then return ()
              else loop0 h
            }

--
{-
*Main> :main
販売価格 1,600 円 (定価 2,000 円から 20 %引き)
販売価格 1,600 円 (定価 2,000 円から 20 %引き)
販売価格 1,600 円 (定価 2,000 円から 20 %引き)
...
... 結果が10000行
...
(1.04 secs, 183701028 bytes)
-}

Index

Feed

Other

Link

Pathtraq

loading...