Skip to content

Instantly share code, notes, and snippets.

@camertron
Last active August 30, 2025 05:41
Show Gist options
  • Save camertron/99a669ca4b20ad2ab7db4e1ab1e56630 to your computer and use it in GitHub Desktop.
Save camertron/99a669ca4b20ad2ab7db4e1ab1e56630 to your computer and use it in GitHub Desktop.
ActiveJob::Serializers benchmark
require "benchmark/ips"
module Mod
end
class CustomClass
end
class CustomClass2
end
class CustomClass3
end
class CustomClassSerializer < ActiveJob::Serializers::ObjectSerializer
def serialize(argument)
super({ "foo" => "bar" })
end
def klass
CustomClass
end
end
class CustomClass2Serializer < ActiveJob::Serializers::ObjectSerializer
def serialize(argument)
super({ "foo" => "bar2" })
end
def klass
CustomClass2
end
end
class CustomClass3Serializer < ActiveJob::Serializers::ObjectSerializer
def serialize(argument)
super({ "foo" => "bar3" })
end
def klass
CustomClass3
end
end
if File.basename(ENV.fetch("BUNDLE_GEMFILE")) == "Gemfile.next"
ActiveJob::Serializers.add_class_based_serializer(CustomClass, CustomClassSerializer.instance)
ActiveJob::Serializers.add_class_based_serializer(CustomClass2, CustomClass2Serializer.instance)
ActiveJob::Serializers.add_class_based_serializer(CustomClass3, CustomClass3Serializer.instance)
else
ActiveJob::Serializers.add_serializers(CustomClassSerializer.instance)
ActiveJob::Serializers.add_serializers(CustomClass2Serializer.instance)
ActiveJob::Serializers.add_serializers(CustomClass3Serializer.instance)
end
ARGS = [
1..2,
DateTime.now,
Time.now,
Date.today,
Mod,
BigDecimal("1.12345"),
:foo,
ActiveSupport::Duration.build(31556952),
Time.zone.now,
CustomClass.new,
CustomClass2.new,
CustomClass3.new
].freeze
Benchmark.ips do |x|
x.report("rails main") do
ActiveJob::Arguments.serialize(ARGS)
end
x.hold!("results.json")
x.report("hash lookup") do
ActiveJob::Arguments.serialize(ARGS)
end
x.compare!
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment