X-Git-Url: http://git.sourceforge.jp/view?p=shogi-server%2Fshogi-server.git;a=blobdiff_plain;f=test%2Fbenchmark.rb;h=28539d7b3f1f0acd6d5e797e3be1aeea95788680;hp=f2067b0dd71ab564cdd09e55f5b7228edc62ecea;hb=f128a5d0b7bebc9e96a4fa3a5ede28d43d8ee499;hpb=f939399ae60b99d0a10b9a7ace7cce259fc0a241 diff --git a/test/benchmark.rb b/test/benchmark.rb index f2067b0..28539d7 100644 --- a/test/benchmark.rb +++ b/test/benchmark.rb @@ -1,6 +1,10 @@ #!/usr/bin/ruby +require 'logger' require 'socket' +require 'thread' + +$logger = nil class BenchPlayer def initialize(game_name, name, sente) @@ -8,6 +12,7 @@ class BenchPlayer @name = "%s_%s" % [game_name, name] @turn_mark = sente ? "+" : "-" @nmoves = 0 + @socket = nil end attr_reader :nmoves @@ -21,37 +26,42 @@ class BenchPlayer def reader Thread.new do + Thread.pass loop do - if r = select([@socket], nil, nil, 10) + if r = select([@socket], nil, nil, 300) str = r[0].first.gets if %r!^[\+\-]\d{4}\w{2},T\d+$! =~ str @nmoves += 1 end - @message << str + @message << str if str else - raise "timed out" + $logger.warn "Timed out: %s" % [@name] end end + $logger.error "Socket error: %s" % [@name] end end def wait(reg) loop do break if reg =~ @message - sleep 0.1 + #$logger.debug "WAIT %s: %s" % [reg, @message] + sleep 0.001 + #Thread.pass end end def wait_nmoves(n) loop do break if @nmoves == n - sleep 0.01 + sleep 0.001 + #Thread.pass end end def login @socket.puts "LOGIN #{@name} dummy x1" - wait %r!^LOGIN! + wait %r!^##\[LOGIN\] \+OK! end def game @@ -77,11 +87,15 @@ class BenchPlayer end class BenchGame + @@mutex = Mutex.new + @@count = 0 def initialize(game_name, csa) @game_name = game_name @csa = csa - @p1 = BenchPlayer.new(@game_name, "bp1", true) - @p2 = BenchPlayer.new(@game_name, "bp2", false) + @@mutex.synchronize do + @p1 = BenchPlayer.new(@game_name, "bp#{@@count+=1}", true) + @p2 = BenchPlayer.new(@game_name, "bp#{@@count+=1}", false) + end end def each_player @@ -89,12 +103,20 @@ class BenchGame end def start + $logger.info "Starting... %s" % [@game_name] + $logger.debug "Connecting... %s" % [@game_name] each_player {|player| player.connect} + $logger.debug "Logging in... %s" % [@game_name] each_player {|player| player.login} + $logger.debug "Sending GAME... %s" % [@game_name] each_player {|player| player.game} + $logger.debug "Waiting... %s" % [@game_name] each_player {|player| player.wait %r!^END Game_Summary!} + $logger.debug "Agreeing... %s" % [@game_name] each_player {|player| player.agree} + $logger.debug "AGREE waiting... %s" % [@game_name] each_player {|player| player.wait %r!^START:!} + $logger.info "Started %s" % [@game_name] turn = true # black nmoves = 0 @csa.each_line do |line| @@ -110,10 +132,15 @@ class BenchGame turn = true nmoves += 1 when /^%TORYO/ + $logger.debug "Waiting TORYO... %s" % [@game_name] + @p1.wait_nmoves nmoves + @p2.wait_nmoves nmoves turn ? @p1.toryo : @p2.toryo end end + $logger.info "Logging out... %s" % [@game_name] each_player {|player| player.logout} + $logger.info "Finished %s" % [@game_name] end end @@ -122,11 +149,15 @@ if __FILE__ == $0 filepath = ARGV.shift || File.join(File.dirname(__FILE__), "csa", "wdoor+floodgate-900-0+gps_normal+gps_l+20100507120007.csa") csa = File.open(filepath){|f| f.read} + $logger = Logger.new(STDOUT) + $logger.level = $DEBUG ? Logger::DEBUG : Logger::INFO + nclients = ARGV.shift || 1 nclients = nclients.to_i threads = [] nclients.times do |i| threads << Thread.new do + Thread.pass game = BenchGame.new("b#{i}", csa) game.start end