require 'benchmark'

TIMES = (ARGV[0] || 5).to_i
Benchmark.bm(30) {|bm|
  TIMES.times {
    bm.report("loop alone") {
      a = 1; while a < 100_000; a += 1; end
    }
  }

  TIMES.times {
    bm.report("no-element hash") {
      a = 1; while a < 100_000; {};{};{};{};{};{};{};{};{};{}; a += 1; end
    }
  }

  TIMES.times {
    bm.report("1-element hash") {
      x = 1
      a = 1; while a < 100_000; {x=>x}; {x=>x}; {x=>x}; {x=>x}; {x=>x}; {x=>x}; {x=>x}; {x=>x}; {x=>x}; {x=>x}; a += 1; end
    }
  }

  TIMES.times {
    bm.report("2-element hash") {
      x = 1
      y = 2
      a = 1; while a < 100_000; {x=>x,y=>y};{x=>x,y=>y};{x=>x,y=>y};{x=>x,y=>y};{x=>x,y=>y};{x=>x,y=>y};{x=>x,y=>y};{x=>x,y=>y};{x=>x,y=>y};{x=>x,y=>y}; a += 1; end
    }
  }

  TIMES.times {
    bm.report("3-element hash") {
      x = 1
      y = 2
      z = 3
      a = 1; while a < 100_000; {x=>x,y=>y,z=>z};{x=>x,y=>y,z=>z};{x=>x,y=>y,z=>z};{x=>x,y=>y,z=>z};{x=>x,y=>y,z=>z};{x=>x,y=>y,z=>z};{x=>x,y=>y,z=>z};{x=>x,y=>y,z=>z};{x=>x,y=>y,z=>z};{x=>x,y=>y,z=>z}; a += 1; end
    }
  }

  TIMES.times {
    bm.report("4-element hash") {
      x = 1
      y = 2
      z = 3
      w = 4
      a = 1; while a < 100_000; {x=>x,y=>y,z=>z,w=>w};{x=>x,y=>y,z=>z,w=>w};{x=>x,y=>y,z=>z,w=>w};{x=>x,y=>y,z=>z,w=>w};{x=>x,y=>y,z=>z,w=>w};{x=>x,y=>y,z=>z,w=>w};{x=>x,y=>y,z=>z,w=>w};{x=>x,y=>y,z=>z,w=>w};{x=>x,y=>y,z=>z,w=>w};{x=>x,y=>y,z=>z,w=>w}; a += 1; end
    }
  }
}