blob: 5b7dbb160ca9f72f260ddc477917dbf1afbd6671 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
|
# Portions Originally Copyright (c) 2008-2011 Brian Lopez - http://github.com/brianmario
# See MIT-LICENSE
require 'rubygems'
require 'benchmark'
require 'stringio'
if !defined?(RUBY_ENGINE) || RUBY_ENGINE !~ /jruby/
if ENV['FORCE_FFI_YAJL'] != 'ext'
begin
require 'yajl'
rescue Exception
puts "INFO: yajl-ruby not installed"
end
else
puts "INFO: skipping yajl-ruby because we're using the C extension"
end
else
puts "INFO: skipping yajl-ruby on jruby"
end
require 'ffi_yajl'
begin
require 'json'
rescue Exception
puts "INFO: json gem not installed"
end
begin
require 'psych'
rescue Exception
puts "INFO: psych gem not installed"
end
begin
require 'active_support'
rescue Exception
puts "INFO: active_support gem not installed"
end
begin
require 'oj'
rescue Exception
puts "INFO: oj gem not installed"
end
module FFI_Yajl
class Benchmark
class Encode
def run
#filename = ARGV[0] || 'benchmark/subjects/ohai.json'
filename = File.expand_path(File.join(File.dirname(__FILE__), "subjects", "ohai.json"))
hash = File.open(filename, 'rb') { |f| FFI_Yajl::Parser.parse(f.read) }
times = ARGV[1] ? ARGV[1].to_i : 1000
puts "Starting benchmark encoding #{filename} #{times} times\n\n"
::Benchmark.bmbm { |x|
x.report("FFI_Yajl::Encoder.encode (to a String)") {
times.times {
output = FFI_Yajl::Encoder.encode(hash)
}
}
ffi_string_encoder = FFI_Yajl::Encoder.new
x.report("FFI_Yajl::Encoder#encode (to a String)") {
times.times {
output = ffi_string_encoder.encode(hash)
}
}
if defined?(Oj)
x.report("Oj.dump (to a String)") {
times.times {
output = Oj.dump(hash)
}
}
end
if defined?(Yajl::Encoder)
x.report("Yajl::Encoder.encode (to a String)") {
times.times {
output = Yajl::Encoder.encode(hash)
}
}
io_encoder = Yajl::Encoder.new
x.report("Yajl::Encoder#encode (to an IO)") {
times.times {
io_encoder.encode(hash, StringIO.new)
}
}
string_encoder = Yajl::Encoder.new
x.report("Yajl::Encoder#encode (to a String)") {
times.times {
output = string_encoder.encode(hash)
}
}
end
if defined?(JSON)
x.report("JSON.generate") {
times.times {
JSON.generate(hash)
}
}
x.report("JSON.fast_generate") {
times.times {
JSON.fast_generate(hash)
}
}
end
if defined?(Psych)
x.report("Psych.to_json") {
times.times {
Psych.to_json(hash)
}
}
if defined?(Psych::JSON::Stream)
x.report("Psych::JSON::Stream") {
times.times {
io = StringIO.new
stream = Psych::JSON::Stream.new io
stream.start
stream.push hash
stream.finish
}
}
end
end
# if defined?(ActiveSupport::JSON)
# x.report("ActiveSupport::JSON.encode") {
# times.times {
# ActiveSupport::JSON.encode(hash)
# }
# }
# end
}
end
end
end
end
|