require 'open3'

N = 22_000_000
I = 1_000_000

def run(name, &block)
  print "-- #{name}: "
  str, array = "0", []

  N.times do |i|
    yield if i % I == 0
    array << str.next!
  end
rescue Errno::ENOMEM
  puts "failed"
else
  puts "ok"
end

strategies = {}

strategies[:nothing] =lambda do
end

strategies[:backtick] =lambda do
  `free -m`
end

strategies[:system] =lambda do
  system "free -m"
end

strategies[:open3] =lambda do
  Open3.popen3 'free -m' do |stdin, stdout, stderr, wait_thread|
    stdin.close_write # make sure it doesn't hang
    status = wait_thread.value
    stdout.read
  end
end

strategy = ARGV[0].to_sym

if strategy == :all
  strategies.keys.shuffle.each do |key|
    run key, &strategies[key]
  end
else
  run strategy, &strategies[strategy]
end