Drb版QueueとQueueでパフォーマンスを比較した

「Drbで作ったプロセスを超えるQueue」と「Queue」のパフォーマンスを比較した、という記事です。

# server
require 'drb/drb'
PROTOCOL = "drbunix"
url = "#{PROTOCOL}:/tmp/procon_bypass_man_queue"
drb_server = DRb.start_service(url, Queue.new, safe_level: 1)
DRb.thread.join
# client
require 'drb/drb'
require "benchmark"
PROTOCOL = "drbunix"
url = "#{PROTOCOL}:/tmp/procon_bypass_man_queue"
drb = DRbObject.new_with_uri(url)
Benchmark.realtime { 1000.times { drb.empty? } } # 0.13338300003670156

queue = Queue.new
Benchmark.realtime { 1000.times { queue.empty? } } # 0.00011600001016631722

結果

プロセスに完結したQueueと比べて、Drb版Queueは1000倍遅かった。

考察

Drb版Queueが遅い理由は、オブジェクトを保持しているマスタープロセスへの問い合わせコストが乗っていると思う。TCPで接続するともう少し遅くなるのかな。今回の結果はDrbの仕組みから考えると普通の結果だと思う。
要件にもよるが、Drbを使う場合メインループ内でDrbオブジェクトに直接触らない方がベターと思いました。