blob: ad0091cfcf398e1ac4072f231ff8f1f0a8d9f2d0 (
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
|
require "rubygems"
require "benchmark"
require "yajl"
require "ffi_yajl"
if !defined?(RUBY_ENGINE) || RUBY_ENGINE !~ /jruby/
begin
require "yajl"
rescue LoadError
puts "INFO: yajl-ruby not installed"
end
else
puts "INFO: skipping yajl-ruby on jruby"
end
begin
require "json"
rescue LoadError
end
begin
require "oj"
rescue LoadError
end
module FFI_Yajl
class Benchmark
class Parse
def run
filename = File.expand_path(File.join(File.dirname(__FILE__), "subjects", "item.json"))
json = File.new(filename, "r")
json_str = json.read
times = ARGV[1] ? ARGV[1].to_i : 10_000
puts "Starting benchmark parsing #{File.size(filename)} bytes of JSON data #{times} times\n\n"
::Benchmark.bmbm do |x|
x.report do
puts "FFI_Yajl::Parser.parse (from a String)"
times.times { FFI_Yajl::Parser.parse(json_str) }
end
# ffi_parser = FFI_Yajl::Parser.new
# x.report {
# puts "FFI_Yajl::Parser#parse (from a String)"
# times.times {
# json.rewind
# ffi_parser.parse(json.read)
# }
# }
if defined?(Yajl::Parser)
x.report do
puts "Yajl::Parser.parse (from a String)"
times.times { Yajl::Parser.parse(json_str) }
end
io_parser = Yajl::Parser.new
io_parser.on_parse_complete = ->(obj) {} if times > 1
x.report do
puts "Yajl::Parser#parse (from an IO)"
times.times do
json.rewind
io_parser.parse(json)
end
end
string_parser = Yajl::Parser.new
string_parser.on_parse_complete = ->(obj) {} if times > 1
x.report do
puts "Yajl::Parser#parse (from a String)"
times.times do
json.rewind
string_parser.parse(json_str)
end
end
end
if defined?(Oj)
x.report do
puts "Oj.load"
times.times do
json.rewind
Oj.load(json.read)
end
end
end
if defined?(JSON)
x.report do
puts "JSON.parse"
times.times do
json.rewind
JSON.parse(json.read, max_nesting: false)
end
end
end
end
json.close
end
end
end
end
|