Slide 10
Slide 10 text
実行するプログラム
# tsp_benchmark.rb
require 'benchmark'
require 'concurrent-edge'
load './common_tsp.rb'
class Resolver < Concurrent::Actor::Context
def initialize (distances )
@distances = distances
end
def on_message (routes)
routes.map {|route|
[route, calc_cost (route, distances )]
}
end
end
def concurent_ruby_solve (routes, distances )
split_num = 12
resolver = Resolver .spawn(:resolver , distances )
promises = routes.each_slice (routes.size / split_num ).map {|chunk|
resolver .ask(chunk)
}
promises .flat_map {|promise| promise.value }.sort_by {|r| r[1] }
end
def normal_solve (routes, distances )
routes.map {|route| [route, calc_cost (route, distances )] }.sort_by
{|r| r[1] }
end
def ractor_solve (routes, distances )
split_num = 12
ractors = routes.each_slice (routes.size / split_num ).map {|chunk|
Ractor.new(chunk, distances ) do |rs, distances |
rs.map {|route|
[ route, calc_cost (route, distances )]
}
end
}
ractors.flat_map {|ractor| ractor.take }.sort_by {|r| r[1] }
end
points = distances .keys
routes = all_routes (points)
Benchmark .bm(16) do |x|
x.report('normal' ) { normal_solve (routes, distances ) }
x.report('concurent-ruby' ) { concurent_ruby_solve (routes,
distances ) }
x.report('Ractor' ) { ractor_solve (routes, distances ) }
end