Runtime assertions for Ruby
literal.fun
ruby
1#!/usr/bin/env ruby
2# frozen_string_literal: true
3
4require "literal"
5require "benchmark/ips"
6require "dry-initializer"
7require "dry-types"
8require "dry-struct"
9
10module Types
11 include Dry.Types()
12end
13
14class NormalClass
15 def initialize(first_name:, last_name:, age:)
16 @first_name = first_name
17 @last_name = last_name
18 @age = age
19 end
20end
21
22class DryClass
23 extend Dry::Initializer
24
25 option :first_name, Types::Strict::String
26 option :last_name, Types::Strict::String
27 option :age, Types::Strict::Integer
28end
29
30class LiteralClass
31 extend Literal::Properties
32
33 prop :first_name, String
34 prop :last_name, String
35 prop :age, Integer
36end
37
38NormalStruct = Struct.new(:first_name, :last_name, :age, keyword_init: true)
39
40class DryStruct < Dry::Struct
41 attribute :first_name, Types::Strict::String
42 attribute :last_name, Types::Strict::String
43 attribute :age, Types::Strict::Integer
44end
45
46class LiteralStruct < Literal::Struct
47 prop :first_name, String
48 prop :last_name, String
49 prop :age, Integer
50end
51
52NormalData = Data.define(:first_name, :last_name, :age)
53
54class LiteralData < Literal::Data
55 prop :first_name, String
56 prop :last_name, String
57 prop :age, Integer
58end
59
60RubyVM::YJIT.enable
61
62Benchmark.ips do |x|
63 # x.report "Ruby Class" do
64 # NormalClass.new(first_name: "Joel", last_name: "Drapper", age: 29)
65 # end
66
67 x.report "Dry::Initializer" do
68 DryClass.new(first_name: "Joel", last_name: "Drapper", age: 29)
69 end
70
71 x.report "Literal::Properties" do
72 LiteralClass.new(first_name: "Joel", last_name: "Drapper", age: 29)
73 end
74
75 x.compare!
76end
77
78Benchmark.ips do |x|
79 # x.report "Ruby Struct" do
80 # NormalStruct.new(first_name: "Joel", last_name: "Drapper", age: 29)
81 # end
82
83 x.report "Dry::Struct" do
84 DryStruct.new(first_name: "Joel", last_name: "Drapper", age: 29)
85 end
86
87 x.report "Literal::Struct" do
88 LiteralStruct.new(first_name: "Joel", last_name: "Drapper", age: 29)
89 end
90
91 x.report "Literal::Data" do
92 LiteralData.new(first_name: "Joel", last_name: "Drapper", age: 29)
93 end
94
95 x.compare!
96end