Created
December 3, 2020 04:54
-
-
Save jgaskins/dc347dfa62f275a4c9563db90b900f12 to your computer and use it in GitHub Desktop.
Benchmarking allocation time of Crystal objects with various quantities of instance variables
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require "benchmark" | |
value = nil | |
Benchmark.ips do |x| | |
x.report "1 ivar" { value = OneIVar.new } | |
x.report "2 ivars" { value = TwoIVars.new } | |
x.report "4 ivars" { value = FourIVars.new } | |
x.report "8 ivars" { value = EightIVars.new } | |
x.report "16 ivars" { value = SixteenIVars.new } | |
end | |
pp value | |
class OneIVar | |
@var1 = "foo" | |
end | |
class TwoIVars | |
@var1 = "foo" | |
@var2 = "foo" | |
end | |
class FourIVars | |
@var1 = "foo" | |
@var2 = "foo" | |
@var3 = "foo" | |
@var4 = "foo" | |
end | |
class EightIVars | |
@var1 = "foo" | |
@var2 = "foo" | |
@var3 = "foo" | |
@var4 = "foo" | |
@var5 = "foo" | |
@var6 = "foo" | |
@var7 = "foo" | |
@var8 = "foo" | |
end | |
class SixteenIVars | |
@var1 = "foo" | |
@var2 = "foo" | |
@var3 = "foo" | |
@var4 = "foo" | |
@var5 = "foo" | |
@var6 = "foo" | |
@var7 = "foo" | |
@var8 = "foo" | |
@var9 = "foo" | |
@var10 = "foo" | |
@var11 = "foo" | |
@var12 = "foo" | |
@var13 = "foo" | |
@var14 = "foo" | |
@var15 = "foo" | |
@var16 = "foo" | |
end |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
$ crystal run --release bench_allocations.cr | |
1 ivar 67.35M ( 14.85ns) (± 1.10%) 32.0B/op fastest | |
2 ivars 66.60M ( 15.01ns) (± 0.99%) 32.0B/op 1.01× slower | |
4 ivars 52.89M ( 18.91ns) (± 1.01%) 48.0B/op 1.27× slower | |
8 ivars 36.03M ( 27.75ns) (± 1.14%) 80.0B/op 1.87× slower | |
16 ivars 21.68M ( 46.12ns) (± 1.05%) 144B/op 3.11× slower |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
s/class/struct/g/
yields equivalent measurements:So this benchmark does not reliably represent a difference based on allocation time.