#!/usr/local/bin/ruby
require 'reqnora'
require 'benchmark'
require 'web/writebuffer'
include Benchmark

def do_func(buf,str,n)
  n.times do
    buf << str << str << str << str << str << str << str << str << str << str
    buf << str << str << str << str << str << str << str << str << str << str
    buf << str << str << str << str << str << str << str << str << str << str
    buf << str << str << str << str << str << str << str << str << str << str
    buf << str << str << str << str << str << str << str << str << str << str
    buf << str << str << str << str << str << str << str << str << str << str
    buf << str << str << str << str << str << str << str << str << str << str
    buf << str << str << str << str << str << str << str << str << str << str
    buf << str << str << str << str << str << str << str << str << str << str
    buf << str << str << str << str << str << str << str << str << str << str
  end
end


benchmark(" "*7 + CAPTION, 10, FMTSTR) do |x|
  
  str = "a"
  x.report("WriteBuffer 1024    1*1000000 ") {
    buf = Web::WriteBuffer.new(1024,1024)
    do_func(buf, str, 10000)
  }
  GC.start
  
  str = "abcdefghij"
  x.report("WriteBuffer 1024    10*1000000 ") {
    buf = Web::WriteBuffer.new(1024,1024)
    do_func(buf, str, 10000)
  }
  GC.start
  
  str = "abcdefghij"*10
  x.report("WriteBuffer 1024    100*1000000") {
    100.times do
      buf = Web::WriteBuffer.new(1024,1024)
      do_func(buf, str, 100)
    end
  }
  GC.start
  
  str = "a"
  x.report("WriteBuffer 4096    1*1000000 ") {
    buf = Web::WriteBuffer.new(4096,4096)
    do_func(buf, str, 10000)
  }
  GC.start
  
  str = "abcdefghij"
  x.report("WriteBuffer 4096    10*1000000 ") {
    buf = Web::WriteBuffer.new(4096,4096)
    do_func(buf, str, 10000)
  }
  GC.start
  
  str = "abcdefghij"*10
  x.report("WriteBuffer 4096    100*1000000") {
    buf = Web::WriteBuffer.new(4096,4096)
    100.times do
      buf = Web::WriteBuffer.new(1024,1024)
      do_func(buf, str, 100)
    end
  }
  GC.start
  
  str = "a"
  x.report("WriteBuffer 65536    1*1000000 ") {
    buf = Web::WriteBuffer.new(65536,65536)
    do_func(buf, str, 10000)
  }
  GC.start
  
  str = "abcdefghij"
  x.report("WriteBuffer 65536    10*1000000 ") {
    buf = Web::WriteBuffer.new(65536,65536)
    do_func(buf, str, 10000)
  }
  GC.start
 
  str = "abcdefghij"*10
  x.report("WriteBuffer 65536    100*1000000") {
    buf = Web::WriteBuffer.new(65536,65536)
    100.times do
      buf = Web::WriteBuffer.new(1024,1024)
      do_func(buf, str, 100)
    end
  }
  GC.start

  init_size = 16*1024*1024
  next_size = 16*1024*1024
  str = "a"
  x.report("WriteBuffer 16M    1*1000000 ") {
    buf = Web::WriteBuffer.new(init_size,next_size)
    do_func(buf, str, 10000)
  }
  GC.start
  
  str = "abcdefghij"
  x.report("WriteBuffer 16M    10*1000000 ") {
    buf = Web::WriteBuffer.new(init_size,next_size)
    do_func(buf, str, 10000)
  }
  GC.start
  
  str = "abcdefghij"*10
  x.report("WriteBuffer 16M    100*1000000") {
    buf = Web::WriteBuffer.new(init_size,next_size)
    100.times do
      buf = Web::WriteBuffer.new(1024,1024)
      do_func(buf, str, 100)
    end
  }
  GC.start
  
  str = "a"
  x.report("String         1*1000000 ") {
    buf = ''
    do_func(buf, str, 10000)
  }
  GC.start
  
  str = "abcdefghij"
  x.report("String         10*1000000 ") {
    buf = ''
    do_func(buf, str, 10000)
  }
  GC.start
  
  str = "abcdefghij"*10
  x.report("String         100*1000000") {
    buf = ''
    do_func(buf, str, 10000)
  }
  GC.start
end