Add big templates
This commit is contained in:
parent
1e8c510d47
commit
b41d194a63
|
@ -0,0 +1 @@
|
||||||
|
/data/*
|
1
Gemfile
1
Gemfile
|
@ -1,5 +1,6 @@
|
||||||
source 'https://rubygems.org'
|
source 'https://rubygems.org'
|
||||||
|
|
||||||
|
gem 'faker'
|
||||||
gem 'tilt'
|
gem 'tilt'
|
||||||
|
|
||||||
gem 'erubis'
|
gem 'erubis'
|
||||||
|
|
|
@ -2,8 +2,11 @@ GEM
|
||||||
remote: https://rubygems.org/
|
remote: https://rubygems.org/
|
||||||
specs:
|
specs:
|
||||||
erubis (2.7.0)
|
erubis (2.7.0)
|
||||||
|
faker (1.2.0)
|
||||||
|
i18n (~> 0.5)
|
||||||
haml (4.0.4)
|
haml (4.0.4)
|
||||||
tilt
|
tilt
|
||||||
|
i18n (0.6.9)
|
||||||
tilt (2.0.0)
|
tilt (2.0.0)
|
||||||
|
|
||||||
PLATFORMS
|
PLATFORMS
|
||||||
|
@ -11,5 +14,6 @@ PLATFORMS
|
||||||
|
|
||||||
DEPENDENCIES
|
DEPENDENCIES
|
||||||
erubis
|
erubis
|
||||||
|
faker
|
||||||
haml
|
haml
|
||||||
tilt
|
tilt
|
||||||
|
|
|
@ -1,10 +1,16 @@
|
||||||
# Template Engine Comparison
|
# Template Engine Comparison
|
||||||
|
|
||||||
## Running
|
## Running
|
||||||
```
|
```bash
|
||||||
|
# Prepare workspace
|
||||||
git clone git@github.com:localhots/template_engine_comparison.git
|
git clone git@github.com:localhots/template_engine_comparison.git
|
||||||
cd template_engine_comparison
|
cd template_engine_comparison
|
||||||
bundle install
|
bundle install
|
||||||
|
|
||||||
|
# Generate data for templates
|
||||||
|
./fakedata.rb 10000 > data/big.yml
|
||||||
|
|
||||||
|
# Run benchmarks
|
||||||
./benchmark.rb
|
./benchmark.rb
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
72
benchmark.rb
72
benchmark.rb
|
@ -3,6 +3,7 @@
|
||||||
require 'rubygems'
|
require 'rubygems'
|
||||||
require 'bundler/setup'
|
require 'bundler/setup'
|
||||||
require 'benchmark'
|
require 'benchmark'
|
||||||
|
require 'yaml'
|
||||||
|
|
||||||
require 'erubis'
|
require 'erubis'
|
||||||
require 'haml'
|
require 'haml'
|
||||||
|
@ -16,55 +17,74 @@ BM_WIDTH = 46
|
||||||
|
|
||||||
# Benchmark settings
|
# Benchmark settings
|
||||||
COMPILE_LOOPS = 1000
|
COMPILE_LOOPS = 1000
|
||||||
RENDER_LOOPS = 10000
|
RENDER_LOOPS = 1000
|
||||||
|
|
||||||
$templates = {}
|
templates = {}
|
||||||
$template_params = {title: 'Greetings!', username: '%username%'}
|
big_data_file = File.expand_path('../data/big.yml', __FILE__)
|
||||||
|
|
||||||
def path_for template
|
unless File.exist?(big_data_file)
|
||||||
File.expand_path('../templates/' + template, __FILE__)
|
raise 'Big data file not found. Please generate it with "./fakedata.rb 10000 > data/big.yml"'
|
||||||
end
|
end
|
||||||
|
|
||||||
|
small_data = {title: 'Greetings!', username: '%username%'}
|
||||||
|
big_data = YAML.load_file(big_data_file)
|
||||||
|
|
||||||
def banner title
|
def banner title
|
||||||
puts '#' * TERMINAL_WIDTH
|
puts '#' * TERMINAL_WIDTH
|
||||||
puts '##' + title.center(TERMINAL_WIDTH - 4) + '##'
|
puts '##' + title.center(TERMINAL_WIDTH - 4) + '##'
|
||||||
puts '#' * TERMINAL_WIDTH
|
puts '#' * TERMINAL_WIDTH
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def benchmark params
|
||||||
|
raise 'No block given' unless block_given?
|
||||||
|
|
||||||
|
Benchmark.bm(TERMINAL_WIDTH - BM_WIDTH) do |x|
|
||||||
|
ENGINES.each do |name, attrs|
|
||||||
|
x.report(name) do
|
||||||
|
params[:loops].times{ yield(name, attrs) }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
ENGINES = {
|
ENGINES = {
|
||||||
erb: {
|
erb: {
|
||||||
class: Tilt::ERBTemplate,
|
class: Tilt::ERBTemplate,
|
||||||
layout: path_for('erb/layout.erb')
|
extension: 'erb'
|
||||||
},
|
},
|
||||||
erubis: {
|
erubis: {
|
||||||
class: Tilt::ErubisTemplate,
|
class: Tilt::ErubisTemplate,
|
||||||
layout: path_for('erubis/layout.erubis')
|
extension: 'erubis'
|
||||||
},
|
},
|
||||||
haml: {
|
haml: {
|
||||||
class: Tilt::HamlTemplate,
|
class: Tilt::HamlTemplate,
|
||||||
layout: path_for('haml/layout.haml')
|
extension: 'haml'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
banner 'Compilation (%d runs)' % COMPILE_LOOPS
|
|
||||||
Benchmark.bm(TERMINAL_WIDTH - BM_WIDTH) do |x|
|
banner 'Compilation (small) (%d runs)' % COMPILE_LOOPS
|
||||||
ENGINES.each do |name, attrs|
|
benchmark(loops: COMPILE_LOOPS) do |name, attrs|
|
||||||
x.report(name) do
|
template_path = File.expand_path('../templates/%s/small.%s', __FILE__) % [name, attrs[:extension]]
|
||||||
COMPILE_LOOPS.times do
|
templates[name] = attrs[:class].new(template_path)
|
||||||
$templates[name] = attrs[:class].new(attrs[:layout])
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
puts
|
puts
|
||||||
|
|
||||||
banner 'Render (%d runs)' % RENDER_LOOPS
|
banner 'Render (small) (%d runs)' % RENDER_LOOPS
|
||||||
Benchmark.bm(TERMINAL_WIDTH - BM_WIDTH) do |x|
|
benchmark(loops: RENDER_LOOPS) do |name, attrs|
|
||||||
ENGINES.each do |name, attrs|
|
templates[name].render(Object, small_data)
|
||||||
x.report(name) do
|
|
||||||
RENDER_LOOPS.times do
|
|
||||||
$templates[name].render(Object, $template_params)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
puts
|
||||||
|
|
||||||
|
banner 'Compilation (big) (%d runs)' % COMPILE_LOOPS
|
||||||
|
benchmark(loops: COMPILE_LOOPS) do |name, attrs|
|
||||||
|
template_path = File.expand_path('../templates/%s/big.%s', __FILE__) % [name, attrs[:extension]]
|
||||||
|
templates[name] = attrs[:class].new(template_path)
|
||||||
|
end
|
||||||
|
puts
|
||||||
|
|
||||||
|
banner 'Render (big) (%d runs)' % RENDER_LOOPS
|
||||||
|
benchmark(loops: 100) do |name, attrs|
|
||||||
|
templates[name].render(Object, customers: big_data)
|
||||||
|
end
|
||||||
|
puts
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
#!/usr/bin/env ruby
|
||||||
|
|
||||||
|
require 'rubygems'
|
||||||
|
require 'bundler/setup'
|
||||||
|
require 'yaml'
|
||||||
|
require 'faker'
|
||||||
|
|
||||||
|
if ARGV.first.to_i > 0
|
||||||
|
num_records = ARGV.first.to_i
|
||||||
|
else
|
||||||
|
num_records = 10
|
||||||
|
end
|
||||||
|
|
||||||
|
data = 1.upto(num_records).map do
|
||||||
|
{
|
||||||
|
name: Faker::Name.name,
|
||||||
|
age: rand(20..50),
|
||||||
|
country: Faker::Address.country,
|
||||||
|
city: Faker::Address.city,
|
||||||
|
zip: Faker::Address.zip.to_i,
|
||||||
|
address: Faker::Address.street_address(true),
|
||||||
|
employer: Faker::Company.name
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
puts YAML.dump(data)
|
|
@ -0,0 +1,25 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Customers List</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<% customers.each do |customer| %>
|
||||||
|
<dl>
|
||||||
|
<dt>Name:</dt>
|
||||||
|
<dd><%= customer[:name] %></dd>
|
||||||
|
<dt>Age:</dt>
|
||||||
|
<dd><%= customer[:age] %></dd>
|
||||||
|
<dt>Address:</dt>
|
||||||
|
<dd>
|
||||||
|
<%= customer[:zip] %>
|
||||||
|
<%= customer[:country] %>
|
||||||
|
<%= customer[:city] %>
|
||||||
|
<%= customer[:address] %>
|
||||||
|
</dd>
|
||||||
|
<dt>Employer:</dt>
|
||||||
|
<dd><%= customer[:employer] %></dd>
|
||||||
|
</dl>
|
||||||
|
<% end %>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,25 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Customers List</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<% customers.each do |customer| %>
|
||||||
|
<dl>
|
||||||
|
<dt>Name:</dt>
|
||||||
|
<dd><%= customer[:name] %></dd>
|
||||||
|
<dt>Age:</dt>
|
||||||
|
<dd><%= customer[:age] %></dd>
|
||||||
|
<dt>Address:</dt>
|
||||||
|
<dd>
|
||||||
|
<%= customer[:zip] %>
|
||||||
|
<%= customer[:country] %>
|
||||||
|
<%= customer[:city] %>
|
||||||
|
<%= customer[:address] %>
|
||||||
|
</dd>
|
||||||
|
<dt>Employer:</dt>
|
||||||
|
<dd><%= customer[:employer] %></dd>
|
||||||
|
</dl>
|
||||||
|
<% end %>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,19 @@
|
||||||
|
!!!
|
||||||
|
%html
|
||||||
|
%head
|
||||||
|
%title Customers List
|
||||||
|
%body
|
||||||
|
- customers.each do |customer|
|
||||||
|
%dl
|
||||||
|
%dt Name:
|
||||||
|
%dd= customer[:name]
|
||||||
|
%dt Age:
|
||||||
|
%dd= customer[:age]
|
||||||
|
%dt Address:
|
||||||
|
%dd
|
||||||
|
= customer[:zip]
|
||||||
|
= customer[:country]
|
||||||
|
= customer[:city]
|
||||||
|
= customer[:address]
|
||||||
|
%dt Employer:
|
||||||
|
%dd= customer[:employer]
|
Loading…
Reference in New Issue