-
-
Notifications
You must be signed in to change notification settings - Fork 9
/
bench.rb
executable file
·96 lines (74 loc) · 1.95 KB
/
bench.rb
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
#!/usr/bin/env ruby
# frozen_string_literal: true
require "literal"
require "benchmark/ips"
require "dry-initializer"
require "dry-types"
require "dry-struct"
module Types
include Dry.Types()
end
class NormalClass
def initialize(first_name:, last_name:, age:)
@first_name = first_name
@last_name = last_name
@age = age
end
end
class DryClass
extend Dry::Initializer
option :first_name, Types::Strict::String
option :last_name, Types::Strict::String
option :age, Types::Strict::Integer
end
class LiteralClass
extend Literal::Properties
prop :first_name, String
prop :last_name, String
prop :age, Integer
end
NormalStruct = Struct.new(:first_name, :last_name, :age, keyword_init: true)
class DryStruct < Dry::Struct
attribute :first_name, Types::Strict::String
attribute :last_name, Types::Strict::String
attribute :age, Types::Strict::Integer
end
class LiteralStruct < Literal::Struct
prop :first_name, String
prop :last_name, String
prop :age, Integer
end
NormalData = Data.define(:first_name, :last_name, :age)
class LiteralData < Literal::Data
prop :first_name, String
prop :last_name, String
prop :age, Integer
end
RubyVM::YJIT.enable
Benchmark.ips do |x|
# x.report "Ruby Class" do
# NormalClass.new(first_name: "Joel", last_name: "Drapper", age: 29)
# end
x.report "Dry::Initializer" do
DryClass.new(first_name: "Joel", last_name: "Drapper", age: 29)
end
x.report "Literal::Properties" do
LiteralClass.new(first_name: "Joel", last_name: "Drapper", age: 29)
end
x.compare!
end
Benchmark.ips do |x|
# x.report "Ruby Struct" do
# NormalStruct.new(first_name: "Joel", last_name: "Drapper", age: 29)
# end
x.report "Dry::Struct" do
DryStruct.new(first_name: "Joel", last_name: "Drapper", age: 29)
end
x.report "Literal::Struct" do
LiteralStruct.new(first_name: "Joel", last_name: "Drapper", age: 29)
end
x.report "Literal::Data" do
LiteralData.new(first_name: "Joel", last_name: "Drapper", age: 29)
end
x.compare!
end