dry-validation/benchmarks/benchmark_form_invalid_huge.rb

54 lines
1.0 KiB
Ruby

# frozen_string_literal: true
require "benchmark/ips"
require "active_model"
require "i18n"
require "dry-validation"
require "byebug"
COUNT = (ENV["COUNT"] || 100).to_i
FIELDS = COUNT.times.map { |i| :"field_#{i}" }
class User
include ActiveModel::Validations
attr_reader(*FIELDS)
validates(*FIELDS, presence: true, numericality: {greater_than: FIELDS.size / 2})
def initialize(attrs)
attrs.each do |field, value|
instance_variable_set(:"@#{field}", value)
end
end
end
contract = Dry::Validation::Contract.build do
config.messages.backend = :i18n
params do
FIELDS.each do |field|
required(field).value(:int?, gt?: FIELDS.size / 2)
end
end
end
params = FIELDS.reduce({}) { |h, f| h.update(f => FIELDS.index(f) + 1) }
puts contract.(params).inspect
puts User.new(params).validate
Benchmark.ips do |x|
x.report("ActiveModel::Validations") do
user = User.new(params)
user.validate
user.errors
end
x.report("dry-validation / schema") do
contract.(params).errors
end
x.compare!
end