Created
October 14, 2015 17:12
-
-
Save simonsj/36bd3ca8476acfdee859 to your computer and use it in GitHub Desktop.
Ruby Object Growth: String literals (frozen and not) versus or'd Regex
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
| #!/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