[#39863] forループの速度 — Masahiro Sato <msato@...>

15 messages 2004/07/20

[#39868] イテレータとfor文 — OOTANI TAKASHI <otn@...5.so-net.ne.jp>

大谷と申します。

31 messages 2004/07/20
[#39886] Re: イテレータとfor文 — Tietew <tietew-ml-ruby-list@...> 2004/07/21

[ruby-list:39889] dRuby: 急に遅くなる

From: ちば けいすけ <chowder@...>
Date: 2004-07-21 11:05:40 UTC
List: ruby-list #39889
ちばです。

dRuby を使った分散アプリケーションで、クライアントからサーバ
に大量のバイナリデータを送る実験をしています。

このメールの最後につけたようなスクリプトを書きました。
クライアントはサーバに自分が作ったオブジェクトへの参照を渡し
ます。サーバはそのオブジェクトから大きな String を繰り返し取
得します。

クライアントは(テストのためにわざとですが)1回ごとに
DRb.start_service を呼んで、サーバにデータを処理させ、
DRb.stop_service を呼びます。
これを何度か繰り返すと、あるところから急に処理時間が4倍くら
いかかるようになります。

なぜこういうことが起きるのでしょうか。

Ruby のバージョンは 1.8.1 mswin32版、dRuby のバージョンは
2.0.4、OS は Windows XP です。サーバとクライアントは同じマシ
ンで実行しました。

また、dRuby でクライアント-サーバ間で大量のバイナリデータを
やり取りするのに簡単で効率のよい方法を教えていただけると嬉し
いです。

よろしくお願いいたします。

#-----------------------------------------------------------
# サーバ
require 'drb/drb'

class ProcessData
  include DRbUndumped
  def process(data)
    1024.times { s = data.get }
  end
end

uri = ARGV.shift || nil
DRb.start_service(uri, ProcessData.new)
puts 'URI: ' + DRb.uri
sleep
#-----------------------------------------------------------
# クライアント
require 'drb/drb'

class GenerateData
  include DRbUndumped
  def get
    return "x" * 1024
  end
end

uri = ARGV.shift || raise("usage: #{$0} URI")
100.times {
  DRb.start_service
  server = DRbObject.new(nil, uri)
  t = Time.now
  server.process(GenerateData.new)
  printf("%8.3f\n", Time.now - t)
  DRb.stop_service
}
#-----------------------------------------------------------

                   ちば けいすけ <chowder@mtj.biglobe.ne.jp>

In This Thread

Prev Next