Skip to content

Instantly share code, notes, and snippets.

@ismailakbudak
Last active February 15, 2020 13:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ismailakbudak/bfdc7149f9fc2e1b14e48924e4027a07 to your computer and use it in GitHub Desktop.
Save ismailakbudak/bfdc7149f9fc2e1b14e48924e4027a07 to your computer and use it in GitHub Desktop.
# ruby 2.6.5
# concurrent-ruby (1.1.5)
# parallel (1.19.1)
gem 'concurrent-ruby'
gem 'parallel'
require 'parallel'
require 'concurrent-ruby'
calculate_with_sleep_proc = proc do |arg|
arg.map do |i|
sleep 3
# long calculation
i * 2 * 1000
end
end
concurrent_with_sleep_proc = proc do |arg|
tasks = arg.map do |i|
Concurrent::Promises.future(i) do |i|
sleep 3
# long calculation
i * 2 * 1000
end
end
Concurrent::Promises.zip(*tasks).value!
end
calculate_proc = proc do |arg|
arg.map do |i|
# long calculation
i * 2 * 1000
end
end
concurrent_proc = proc do |arg|
tasks = arg.map do |i|
Concurrent::Promises.future(i) do |i|
# long calculation
i * 2 * 1000
end
end
Concurrent::Promises.zip(*tasks).value!
end
parallel_proc = proc do |arg_array, process_count, proc|
slice_count = arg_array.length / (process_count - 1)
arrays = arg_array.each_slice(slice_count)
Parallel.map(arrays, in_processes: process_count) do |array|
proc.call array
end
end
require 'benchmark'
include Benchmark # we need the CAPTION and FORMAT constants
arg_array = Array(1...10000)
puts 'With sleep;'
Benchmark.benchmark(CAPTION, 7, FORMAT) do |x|
x.report("p&c10 :") { parallel_proc.call(arg_array, 10, concurrent_with_sleep_proc) }
x.report("p&c11 :") { parallel_proc.call(arg_array, 11, concurrent_with_sleep_proc) }
x.report("p&c12 :") { parallel_proc.call(arg_array, 12, concurrent_with_sleep_proc) }
x.report("p&c13 :") { parallel_proc.call(arg_array, 13, concurrent_with_sleep_proc) }
x.report("p&c14 :") { parallel_proc.call(arg_array, 14, concurrent_with_sleep_proc) }
x.report("p&c15 :") { parallel_proc.call(arg_array, 15, concurrent_with_sleep_proc) }
x.report("p&c16 :") { parallel_proc.call(arg_array, 16, concurrent_with_sleep_proc) }
x.report("p&c17 :") { parallel_proc.call(arg_array, 17, concurrent_with_sleep_proc) }
x.report("p&c18 :") { parallel_proc.call(arg_array, 18, concurrent_with_sleep_proc) }
x.report("p&c19 :") { parallel_proc.call(arg_array, 19, concurrent_with_sleep_proc) }
x.report("p&c20 :") { parallel_proc.call(arg_array, 20, concurrent_with_sleep_proc) }
x.report("p&c21 :") { parallel_proc.call(arg_array, 21, concurrent_with_sleep_proc) }
x.report("p&c22 :") { parallel_proc.call(arg_array, 22, concurrent_with_sleep_proc) }
x.report("p&c23 :") { parallel_proc.call(arg_array, 23, concurrent_with_sleep_proc) }
x.report("p&c24 :") { parallel_proc.call(arg_array, 24, concurrent_with_sleep_proc) }
x.report("p&c25 :") { parallel_proc.call(arg_array, 25, concurrent_with_sleep_proc) }
x.report("p&c26 :") { parallel_proc.call(arg_array, 26, concurrent_with_sleep_proc) }
x.report("c :") { concurrent_with_sleep_proc.call(arg_array) }
end
puts 'Without sleep;'
Benchmark.benchmark(CAPTION, 7, FORMAT) do |x|
x.report("p&c10 :") { parallel_proc.call(arg_array, 10, concurrent_proc) }
x.report("p&c11 :") { parallel_proc.call(arg_array, 11, concurrent_proc) }
x.report("p&c12 :") { parallel_proc.call(arg_array, 12, concurrent_proc) }
x.report("p&c13 :") { parallel_proc.call(arg_array, 13, concurrent_proc) }
x.report("p&c14 :") { parallel_proc.call(arg_array, 14, concurrent_proc) }
x.report("p&c15 :") { parallel_proc.call(arg_array, 15, concurrent_proc) }
x.report("p&c16 :") { parallel_proc.call(arg_array, 16, concurrent_proc) }
x.report("p&c17 :") { parallel_proc.call(arg_array, 17, concurrent_proc) }
x.report("p&c18 :") { parallel_proc.call(arg_array, 18, concurrent_proc) }
x.report("p&c19 :") { parallel_proc.call(arg_array, 19, concurrent_proc) }
x.report("p&c20 :") { parallel_proc.call(arg_array, 20, concurrent_proc) }
x.report("p&c21 :") { parallel_proc.call(arg_array, 21, concurrent_proc) }
x.report("p&c22 :") { parallel_proc.call(arg_array, 22, concurrent_proc) }
x.report("p&c23 :") { parallel_proc.call(arg_array, 23, concurrent_proc) }
x.report("p&c24 :") { parallel_proc.call(arg_array, 24, concurrent_proc) }
x.report("p&c25 :") { parallel_proc.call(arg_array, 25, concurrent_proc) }
x.report("p&c26 :") { parallel_proc.call(arg_array, 26, concurrent_proc) }
x.report("p10 :") { parallel_proc.call(arg_array, 10, calculate_proc) }
x.report("p11 :") { parallel_proc.call(arg_array, 11, calculate_proc) }
x.report("p12 :") { parallel_proc.call(arg_array, 12, calculate_proc) }
x.report("p13 :") { parallel_proc.call(arg_array, 13, calculate_proc) }
x.report("p14 :") { parallel_proc.call(arg_array, 14, calculate_proc) }
x.report("p15 :") { parallel_proc.call(arg_array, 15, calculate_proc) }
x.report("p16 :") { parallel_proc.call(arg_array, 16, calculate_proc) }
x.report("p17 :") { parallel_proc.call(arg_array, 17, calculate_proc) }
x.report("p18 :") { parallel_proc.call(arg_array, 18, calculate_proc) }
x.report("p19 :") { parallel_proc.call(arg_array, 19, calculate_proc) }
x.report("p20 :") { parallel_proc.call(arg_array, 20, calculate_proc) }
x.report("p21 :") { parallel_proc.call(arg_array, 21, calculate_proc) }
x.report("p22 :") { parallel_proc.call(arg_array, 22, calculate_proc) }
x.report("p23 :") { parallel_proc.call(arg_array, 23, calculate_proc) }
x.report("p24 :") { parallel_proc.call(arg_array, 24, calculate_proc) }
x.report("p25 :") { parallel_proc.call(arg_array, 25, calculate_proc) }
x.report("p26 :") { parallel_proc.call(arg_array, 26, calculate_proc) }
x.report("c :") { concurrent_proc.call(arg_array) }
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment