Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Select an option

  • Save simonsj/36bd3ca8476acfdee859 to your computer and use it in GitHub Desktop.

Select an option

Save simonsj/36bd3ca8476acfdee859 to your computer and use it in GitHub Desktop.
Ruby Object Growth: String literals (frozen and not) versus or'd Regex
#!/usr/share/rbenv/shims/ruby
# ruby 2.1.7p400-github-tcmalloc (b3255a8b57) [x86_64-linux]
# object start: 3522021
# running start_with on frozen args
# object growth: 8976
# object growth: 664
# object growth: 664
# object growth: 664
# running start_with on unfrozen args
# object growth: 664
# object growth: 664
# object growth: 664
# object growth: 664
# running regex matcher
# object growth: 1703
# object growth: 664
# object growth: 664
# object growth: 664
require 'objspace'
require 'pp'
GC.disable
def run_start_with_frozen(s)
s.start_with?(
"1".freeze,
"2".freeze,
"3".freeze,
"4".freeze,
"5".freeze,
"6".freeze,
"7".freeze,
"8".freeze,
"9".freeze,
"10".freeze,
"11".freeze,
"12".freeze,
"13".freeze,
"14".freeze,
"15".freeze,
"16".freeze,
"17".freeze,
"18".freeze,
"19".freeze,
"20".freeze,
"21".freeze,
"22".freeze,
"23".freeze,
"24".freeze,
"25".freeze,
"26".freeze,
"27".freeze,
"28".freeze,
"29".freeze,
"30".freeze,
"31".freeze,
"32".freeze,
"33".freeze,
"34".freeze,
"35".freeze,
"36".freeze,
"37".freeze,
"38".freeze,
"39".freeze,
"40".freeze,
"41".freeze,
"42".freeze,
"43".freeze,
"44".freeze,
"45".freeze,
"46".freeze,
"47".freeze,
"48".freeze,
"49".freeze,
"50".freeze,
"51".freeze,
"52".freeze,
"53".freeze,
"54".freeze,
"55".freeze,
"56".freeze,
"57".freeze,
"58".freeze,
"59".freeze,
"60".freeze,
"61".freeze,
"62".freeze,
"63".freeze,
"64".freeze,
"65".freeze,
"66".freeze,
"67".freeze,
"68".freeze,
"69".freeze,
"70".freeze,
"71".freeze,
"72".freeze,
"73".freeze,
"74".freeze,
"75".freeze,
"76".freeze,
"77".freeze,
"78".freeze,
"79".freeze,
"80".freeze,
"81".freeze,
"82".freeze,
"83".freeze,
"84".freeze,
"85".freeze,
"86".freeze,
"87".freeze,
"88".freeze,
"89".freeze,
"90".freeze,
"91".freeze,
"92".freeze,
"93".freeze,
"94".freeze,
"95".freeze,
"96".freeze,
"97".freeze,
"98".freeze,
"99".freeze,
"100".freeze
)
end
def run_start_with_unfrozen(s)
s.start_with?(
"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",
"97",
"98",
"99",
"100"
)
end
def run_regex_matcher(s)
(s =~ /\A1\Z|\A2\Z|\A3\Z|\A4\Z|\A5\Z|\A6\Z|\A7\Z|\A8\Z|\A9\Z|\A10\Z|\A11\Z|\A12\Z|\A13\Z|\A14\Z|\A15\Z|\A16\Z|\A17\Z|\A18\Z|\A19\Z|\A20\Z|\A21\Z|\A22\Z|\A23\Z|\A24\Z|\A25\Z|\A26\Z|\A27\Z|\A28\Z|\A29\Z|\A30\Z|\A31\Z|\A32\Z|\A33\Z|\A34\Z|\A35\Z|\A36\Z|\A37\Z|\A38\Z|\A39\Z|\A40\Z|\A41\Z|\A42\Z|\A43\Z|\A44\Z|\A45\Z|\A46\Z|\A47\Z|\A48\Z|\A49\Z|\A50\Z|\A51\Z|\A52\Z|\A53\Z|\A54\Z|\A55\Z|\A56\Z|\A57\Z|\A58\Z|\A59\Z|\A60\Z|\A61\Z|\A62\Z|\A63\Z|\A64\Z|\A65\Z|\A66\Z|\A67\Z|\A68\Z|\A69\Z|\A70\Z|\A71\Z|\A72\Z|\A73\Z|\A74\Z|\A75\Z|\A76\Z|\A77\Z|\A78\Z|\A79\Z|\A80\Z|\A81\Z|\A82\Z|\A83\Z|\A84\Z|\A85\Z|\A86\Z|\A87\Z|\A88\Z|\A89\Z|\A90\Z|\A91\Z|\A92\Z|\A93\Z|\A94\Z|\A95\Z|\A96\Z|\A97\Z|\A98\Z|\A99\Z|\A100\Z/).nil?
end
prev_total_objects = 0
total_objects = 0
s = "foobar".freeze
total_objects = ObjectSpace::count_objects_size()[:TOTAL]
puts "object start: #{total_objects - prev_total_objects}"
prev_total_objects = total_objects
puts "running start_with on frozen args"
run_start_with_frozen(s)
total_objects = ObjectSpace::count_objects_size()[:TOTAL]
puts "object growth: #{total_objects - prev_total_objects}"
prev_total_objects = total_objects
run_start_with_frozen(s)
total_objects = ObjectSpace::count_objects_size()[:TOTAL]
puts "object growth: #{total_objects - prev_total_objects}"
prev_total_objects = total_objects
run_start_with_frozen(s)
total_objects = ObjectSpace::count_objects_size()[:TOTAL]
puts "object growth: #{total_objects - prev_total_objects}"
prev_total_objects = total_objects
run_start_with_frozen(s)
run_start_with_frozen(s)
run_start_with_frozen(s)
run_start_with_frozen(s)
run_start_with_frozen(s)
total_objects = ObjectSpace::count_objects_size()[:TOTAL]
puts "object growth: #{total_objects - prev_total_objects}"
prev_total_objects = total_objects
puts "running start_with on unfrozen args"
run_start_with_unfrozen(s)
total_objects = ObjectSpace::count_objects_size()[:TOTAL]
puts "object growth: #{total_objects - prev_total_objects}"
prev_total_objects = total_objects
run_start_with_unfrozen(s)
total_objects = ObjectSpace::count_objects_size()[:TOTAL]
puts "object growth: #{total_objects - prev_total_objects}"
prev_total_objects = total_objects
run_start_with_unfrozen(s)
total_objects = ObjectSpace::count_objects_size()[:TOTAL]
puts "object growth: #{total_objects - prev_total_objects}"
prev_total_objects = total_objects
run_start_with_unfrozen(s)
run_start_with_unfrozen(s)
run_start_with_unfrozen(s)
run_start_with_unfrozen(s)
run_start_with_unfrozen(s)
total_objects = ObjectSpace::count_objects_size()[:TOTAL]
puts "object growth: #{total_objects - prev_total_objects}"
prev_total_objects = total_objects
puts "running regex matcher"
run_regex_matcher(s)
total_objects = ObjectSpace::count_objects_size()[:TOTAL]
puts "object growth: #{total_objects - prev_total_objects}"
prev_total_objects = total_objects
run_regex_matcher(s)
total_objects = ObjectSpace::count_objects_size()[:TOTAL]
puts "object growth: #{total_objects - prev_total_objects}"
prev_total_objects = total_objects
run_regex_matcher(s)
total_objects = ObjectSpace::count_objects_size()[:TOTAL]
puts "object growth: #{total_objects - prev_total_objects}"
prev_total_objects = total_objects
run_regex_matcher(s)
run_regex_matcher(s)
run_regex_matcher(s)
run_regex_matcher(s)
run_regex_matcher(s)
total_objects = ObjectSpace::count_objects_size()[:TOTAL]
puts "object growth: #{total_objects - prev_total_objects}"
prev_total_objects = total_objects
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment