1
0
Fork 0
mirror of https://github.com/haml/haml.git synced 2022-11-09 12:33:31 -05:00
haml--haml/benchmarks/benchmark.rb

110 lines
3 KiB
Ruby
Raw Normal View History

2015-03-09 02:22:59 -04:00
#!/usr/bin/env ruby
$:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'), File.dirname(__FILE__))
require_relative './context'
require 'benchmark/ips'
2015-03-09 02:37:26 -04:00
2015-03-09 02:22:59 -04:00
require 'erb'
2015-03-09 02:37:26 -04:00
require 'erubis'
2015-03-28 01:32:20 -04:00
require 'faml'
2015-03-09 02:22:59 -04:00
require 'haml'
require 'slim'
2015-03-09 03:08:19 -04:00
require 'tenjin'
2015-03-09 02:37:26 -04:00
require 'tilt'
require 'hamlit'
2015-03-09 02:22:59 -04:00
class Benchmarks
2015-03-09 06:14:31 -04:00
def initialize(time)
2015-03-28 01:51:24 -04:00
@time = time
@benches = []
@versions = {}
2015-03-09 02:22:59 -04:00
2015-03-09 03:08:19 -04:00
@erb_code = File.read(File.dirname(__FILE__) + '/view.erb')
@haml_code = File.read(File.dirname(__FILE__) + '/view.haml')
@slim_code = File.read(File.dirname(__FILE__) + '/view.slim')
@rbhtml_path = File.dirname(__FILE__) + '/view.rbhtml'
2015-03-09 02:22:59 -04:00
init_compiled_benches
end
def init_compiled_benches
erb = ERB.new(@erb_code)
erubis = Erubis::Eruby.new(@erb_code)
fast_erubis = Erubis::FastEruby.new(@erb_code)
haml_ugly = Haml::Engine.new(@haml_code, format: :html5, ugly: true)
2015-03-09 03:08:19 -04:00
tenjin = Tenjin::Engine.new.get_template(@rbhtml_path)
2015-03-09 02:22:59 -04:00
2015-03-09 03:08:19 -04:00
context = Context.new
2015-03-09 02:22:59 -04:00
haml_ugly.def_method(context, :run_haml_ugly)
context.instance_eval %{
def run_erb; #{erb.src}; end
def run_erubis; #{erubis.src}; end
def run_temple_erb; #{Temple::ERB::Engine.new.call @erb_code}; end
def run_fast_erubis; #{fast_erubis.src}; end
def run_slim_ugly; #{Slim::Engine.new.call @slim_code}; end
2015-03-28 01:32:20 -04:00
def run_faml; #{Faml::Engine.new.call @haml_code}; end
2015-03-09 03:08:19 -04:00
def run_tenjin; _buf = ''; #{tenjin.script}; end
def run_hamlit; #{Hamlit::Engine.new.call @haml_code}; end
2015-03-09 02:22:59 -04:00
}
2015-03-30 03:16:54 -04:00
bench('hamlit', Hamlit::VERSION) { context.run_hamlit }
bench('erubis', Erubis::VERSION) { context.run_erubis }
bench('slim', Slim::VERSION) { context.run_slim_ugly }
bench('faml', Faml::VERSION) { context.run_faml }
bench('haml', Haml::VERSION) { context.run_haml_ugly }
2015-03-15 11:55:25 -04:00
if ENV['ALL']
2015-03-28 01:51:24 -04:00
erb_version = ERB.version.match(/\[([^ ]+)/)[1]
bench('tenjin', Tenjin::RELEASE) { context.run_tenjin }
bench('fast erubis', Erubis::VERSION) { context.run_fast_erubis }
bench('temple erb', Temple::VERSION) { context.run_temple_erb }
bench('erb', erb_version) { context.run_erb }
2015-03-15 11:55:25 -04:00
end
2015-03-09 02:22:59 -04:00
end
def run
2015-03-28 01:51:24 -04:00
show_versions
2015-03-28 01:21:48 -04:00
result = Benchmark.ips do |x|
2015-03-09 06:14:31 -04:00
x.config(time: @time, warmup: 2)
2015-03-09 02:22:59 -04:00
@benches.each do |name, block|
x.report(name, &block)
end
x.compare!
end
2015-03-30 02:53:52 -04:00
assert_fastest(result)
2015-03-09 02:22:59 -04:00
end
2015-03-28 01:51:24 -04:00
private
def bench(name, version, &block)
2015-03-09 02:22:59 -04:00
@benches.push([name, block])
2015-03-28 01:51:24 -04:00
@versions[name] = version
end
def show_versions
puts 'Versions ' + '-' * 40
@versions.each do |name, version|
printf "%20s %10s\n", name, "v#{version}"
end
2015-03-09 02:22:59 -04:00
end
2015-03-28 01:21:48 -04:00
def assert_fastest(result)
hamlit = result.entries.first
rival = result.entries[1..-1].max_by(&:ips)
if hamlit.ips < rival.ips
fatal "Hamlit is slower than #{rival.label}"
end
end
def fatal(message)
puts "\e[31m#{message}\e[0m"
exit 1
end
2015-03-09 02:22:59 -04:00
end
2015-03-09 06:14:31 -04:00
time = (ENV['TIME'] || 5).to_i
Benchmarks.new(time).run