Created
August 19, 2016 12:14
-
-
Save lbguilherme/c7249c408d2a226bdbb6892dda5e9ab2 to your computer and use it in GitHub Desktop.
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
| check every key 5.14 (± 2.82%) 16.03× slower | |
| trie lookup 82.47 (± 1.80%) fastest |
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
| COLORS = { | |
| AliceBlue: "#f0f8ff", | |
| AntiqueWhite: "#faebd7", | |
| AntiqueWhite1: "#ffefdb", | |
| AntiqueWhite2: "#eedfcc", | |
| AntiqueWhite3: "#cdc0b0", | |
| AntiqueWhite4: "#8b8378", | |
| aquamarine1: "#7fffd4", | |
| aquamarine2: "#76eec6", | |
| aquamarine4: "#458b74", | |
| azure1: "#f0ffff", | |
| azure2: "#e0eeee", | |
| azure3: "#c1cdcd", | |
| azure4: "#838b8b", | |
| beige: "#f5f5dc", | |
| bisque1: "#ffe4c4", | |
| bisque2: "#eed5b7", | |
| bisque3: "#cdb79e", | |
| bisque4: "#8b7d6b", | |
| black: "#000000", | |
| BlanchedAlmond: "#ffebcd", | |
| blue1: "#0000ff", | |
| blue2: "#0000ee", | |
| blue4: "#00008b", | |
| BlueViolet: "#8a2be2", | |
| brown: "#a52a2a", | |
| brown1: "#ff4040", | |
| brown2: "#ee3b3b", | |
| brown3: "#cd3333", | |
| brown4: "#8b2323", | |
| burlywood: "#deb887", | |
| burlywood1: "#ffd39b", | |
| burlywood2: "#eec591", | |
| burlywood3: "#cdaa7d", | |
| burlywood4: "#8b7355", | |
| CadetBlue: "#5f9ea0", | |
| CadetBlue1: "#98f5ff", | |
| CadetBlue2: "#8ee5ee", | |
| CadetBlue3: "#7ac5cd", | |
| CadetBlue4: "#53868b", | |
| chartreuse1: "#7fff00", | |
| chartreuse2: "#76ee00", | |
| chartreuse3: "#66cd00", | |
| chartreuse4: "#458b00", | |
| chocolate: "#d2691e", | |
| chocolate1: "#ff7f24", | |
| chocolate2: "#ee7621", | |
| chocolate3: "#cd661d", | |
| coral: "#ff7f50", | |
| coral1: "#ff7256", | |
| coral2: "#ee6a50", | |
| coral3: "#cd5b45", | |
| coral4: "#8b3e2f", | |
| CornflowerBlue: "#6495ed", | |
| cornsilk1: "#fff8dc", | |
| cornsilk2: "#eee8cd", | |
| cornsilk3: "#cdc8b1", | |
| cornsilk4: "#8b8878", | |
| cyan1: "#00ffff", | |
| cyan2: "#00eeee", | |
| cyan3: "#00cdcd", | |
| cyan4: "#008b8b", | |
| DarkGoldenrod: "#b8860b", | |
| DarkGoldenrod1: "#ffb90f", | |
| DarkGoldenrod2: "#eead0e", | |
| DarkGoldenrod3: "#cd950c", | |
| DarkGoldenrod4: "#8b6508", | |
| DarkGreen: "#006400", | |
| DarkKhaki: "#bdb76b", | |
| DarkOliveGreen: "#556b2f", | |
| DarkOliveGreen1: "#caff70", | |
| DarkOliveGreen2: "#bcee68", | |
| DarkOliveGreen3: "#a2cd5a", | |
| DarkOliveGreen4: "#6e8b3d", | |
| DarkOrange: "#ff8c00", | |
| DarkOrange1: "#ff7f00", | |
| DarkOrange2: "#ee7600", | |
| DarkOrange3: "#cd6600", | |
| DarkOrange4: "#8b4500", | |
| DarkOrchid: "#9932cc", | |
| DarkOrchid1: "#bf3eff", | |
| DarkOrchid2: "#b23aee", | |
| DarkOrchid3: "#9a32cd", | |
| DarkOrchid4: "#68228b", | |
| DarkSalmon: "#e9967a", | |
| DarkSeaGreen: "#8fbc8f", | |
| DarkSeaGreen1: "#c1ffc1", | |
| DarkSeaGreen2: "#b4eeb4", | |
| DarkSeaGreen3: "#9bcd9b", | |
| DarkSeaGreen4: "#698b69", | |
| DarkSlateBlue: "#483d8b", | |
| DarkSlateGray: "#2f4f4f", | |
| DarkSlateGray1: "#97ffff", | |
| DarkSlateGray2: "#8deeee", | |
| DarkSlateGray3: "#79cdcd", | |
| DarkSlateGray4: "#528b8b", | |
| DarkTurquoise: "#00ced1", | |
| DarkViolet: "#9400d3", | |
| DeepPink1: "#ff1493", | |
| DeepPink2: "#ee1289", | |
| DeepPink3: "#cd1076", | |
| DeepPink4: "#8b0a50", | |
| DeepSkyBlue1: "#00bfff", | |
| DeepSkyBlue2: "#00b2ee", | |
| DeepSkyBlue3: "#009acd", | |
| DeepSkyBlue4: "#00688b", | |
| DimGray: "#696969", | |
| DodgerBlue1: "#1e90ff", | |
| DodgerBlue2: "#1c86ee", | |
| DodgerBlue3: "#1874cd", | |
| DodgerBlue4: "#104e8b", | |
| firebrick: "#b22222", | |
| firebrick1: "#ff3030", | |
| firebrick2: "#ee2c2c", | |
| firebrick3: "#cd2626", | |
| firebrick4: "#8b1a1a", | |
| FloralWhite: "#fffaf0", | |
| ForestGreen: "#228b22", | |
| gainsboro: "#dcdcdc", | |
| GhostWhite: "#f8f8ff", | |
| gold1: "#ffd700", | |
| gold2: "#eec900", | |
| gold3: "#cdad00", | |
| gold4: "#8b7500", | |
| goldenrod: "#daa520", | |
| goldenrod1: "#ffc125", | |
| goldenrod2: "#eeb422", | |
| goldenrod3: "#cd9b1d", | |
| goldenrod4: "#8b6914", | |
| gray: "#bebebe", | |
| gray1: "#030303", | |
| gray10: "#1a1a1a", | |
| gray11: "#1c1c1c", | |
| gray12: "#1f1f1f", | |
| gray13: "#212121", | |
| gray14: "#242424", | |
| gray15: "#262626", | |
| gray16: "#292929", | |
| gray17: "#2b2b2b", | |
| gray18: "#2e2e2e", | |
| gray19: "#303030", | |
| gray2: "#050505", | |
| gray20: "#333333", | |
| gray21: "#363636", | |
| gray22: "#383838", | |
| gray23: "#3b3b3b", | |
| gray24: "#3d3d3d", | |
| gray25: "#404040", | |
| gray26: "#424242", | |
| gray27: "#454545", | |
| gray28: "#474747", | |
| gray29: "#4a4a4a", | |
| gray3: "#080808", | |
| gray30: "#4d4d4d", | |
| gray31: "#4f4f4f", | |
| gray32: "#525252", | |
| gray33: "#545454", | |
| gray34: "#575757", | |
| gray35: "#595959", | |
| gray36: "#5c5c5c", | |
| gray37: "#5e5e5e", | |
| gray38: "#616161", | |
| gray39: "#636363", | |
| gray4: "#0a0a0a", | |
| gray40: "#666666", | |
| gray41: "#696969", | |
| gray42: "#6b6b6b", | |
| gray43: "#6e6e6e", | |
| gray44: "#707070", | |
| gray45: "#737373", | |
| gray46: "#757575", | |
| gray47: "#787878", | |
| gray48: "#7a7a7a", | |
| gray49: "#7d7d7d", | |
| gray5: "#0d0d0d", | |
| gray50: "#7f7f7f", | |
| gray51: "#828282", | |
| gray52: "#858585", | |
| gray53: "#878787", | |
| gray54: "#8a8a8a", | |
| gray55: "#8c8c8c", | |
| gray56: "#8f8f8f", | |
| gray57: "#919191", | |
| gray58: "#949494", | |
| gray59: "#969696", | |
| gray6: "#0f0f0f", | |
| gray60: "#999999", | |
| gray61: "#9c9c9c", | |
| gray62: "#9e9e9e", | |
| gray63: "#a1a1a1", | |
| gray64: "#a3a3a3", | |
| gray65: "#a6a6a6", | |
| gray66: "#a8a8a8", | |
| gray67: "#ababab", | |
| gray68: "#adadad", | |
| gray69: "#b0b0b0", | |
| gray7: "#121212", | |
| gray70: "#b3b3b3", | |
| gray71: "#b5b5b5", | |
| gray72: "#b8b8b8", | |
| gray73: "#bababa", | |
| gray74: "#bdbdbd", | |
| gray75: "#bfbfbf", | |
| gray76: "#c2c2c2", | |
| gray77: "#c4c4c4", | |
| gray78: "#c7c7c7", | |
| gray79: "#c9c9c9", | |
| gray8: "#141414", | |
| gray80: "#cccccc", | |
| gray81: "#cfcfcf", | |
| gray82: "#d1d1d1", | |
| gray83: "#d4d4d4", | |
| gray84: "#d6d6d6", | |
| gray85: "#d9d9d9", | |
| gray86: "#dbdbdb", | |
| gray87: "#dedede", | |
| gray88: "#e0e0e0", | |
| gray89: "#e3e3e3", | |
| gray9: "#171717", | |
| gray90: "#e5e5e5", | |
| gray91: "#e8e8e8", | |
| gray92: "#ebebeb", | |
| gray93: "#ededed", | |
| gray94: "#f0f0f0", | |
| gray95: "#f2f2f2", | |
| gray97: "#f7f7f7", | |
| gray98: "#fafafa", | |
| gray99: "#fcfcfc", | |
| green1: "#00ff00", | |
| green2: "#00ee00", | |
| green3: "#00cd00", | |
| green4: "#008b00", | |
| GreenYellow: "#adff2f", | |
| honeydew1: "#f0fff0", | |
| honeydew2: "#e0eee0", | |
| honeydew3: "#c1cdc1", | |
| honeydew4: "#838b83", | |
| HotPink: "#ff69b4", | |
| HotPink1: "#ff6eb4", | |
| HotPink2: "#ee6aa7", | |
| HotPink3: "#cd6090", | |
| HotPink4: "#8b3a62", | |
| IndianRed: "#cd5c5c", | |
| IndianRed1: "#ff6a6a", | |
| IndianRed2: "#ee6363", | |
| IndianRed3: "#cd5555", | |
| IndianRed4: "#8b3a3a", | |
| ivory1: "#fffff0", | |
| ivory2: "#eeeee0", | |
| ivory3: "#cdcdc1", | |
| ivory4: "#8b8b83", | |
| khaki: "#f0e68c", | |
| khaki1: "#fff68f", | |
| khaki2: "#eee685", | |
| khaki3: "#cdc673", | |
| khaki4: "#8b864e", | |
| lavender: "#e6e6fa", | |
| LavenderBlush1: "#fff0f5", | |
| LavenderBlush2: "#eee0e5", | |
| LavenderBlush3: "#cdc1c5", | |
| LavenderBlush4: "#8b8386", | |
| LawnGreen: "#7cfc00", | |
| LemonChiffon1: "#fffacd", | |
| LemonChiffon2: "#eee9bf", | |
| LemonChiffon3: "#cdc9a5", | |
| LemonChiffon4: "#8b8970", | |
| light: "#eedd82", | |
| LightBlue: "#add8e6", | |
| LightBlue1: "#bfefff", | |
| LightBlue2: "#b2dfee", | |
| LightBlue3: "#9ac0cd", | |
| LightBlue4: "#68838b", | |
| LightCoral: "#f08080", | |
| LightCyan1: "#e0ffff", | |
| LightCyan2: "#d1eeee", | |
| LightCyan3: "#b4cdcd", | |
| LightCyan4: "#7a8b8b", | |
| LightGoldenrod1: "#ffec8b", | |
| LightGoldenrod2: "#eedc82", | |
| LightGoldenrod3: "#cdbe70", | |
| LightGoldenrod4: "#8b814c", | |
| LightGoldenrodYellow: "#fafad2", | |
| LightGray: "#d3d3d3", | |
| LightPink: "#ffb6c1", | |
| LightPink1: "#ffaeb9", | |
| LightPink2: "#eea2ad", | |
| LightPink3: "#cd8c95", | |
| LightPink4: "#8b5f65", | |
| LightSalmon1: "#ffa07a", | |
| LightSalmon2: "#ee9572", | |
| LightSalmon3: "#cd8162", | |
| LightSalmon4: "#8b5742", | |
| LightSeaGreen: "#20b2aa", | |
| LightSkyBlue: "#87cefa", | |
| LightSkyBlue1: "#b0e2ff", | |
| LightSkyBlue2: "#a4d3ee", | |
| LightSkyBlue3: "#8db6cd", | |
| LightSkyBlue4: "#607b8b", | |
| LightSlateBlue: "#8470ff", | |
| LightSlateGray: "#778899", | |
| LightSteelBlue: "#b0c4de", | |
| LightSteelBlue1: "#cae1ff", | |
| LightSteelBlue2: "#bcd2ee", | |
| LightSteelBlue3: "#a2b5cd", | |
| LightSteelBlue4: "#6e7b8b", | |
| LightYellow1: "#ffffe0", | |
| LightYellow2: "#eeeed1", | |
| LightYellow3: "#cdcdb4", | |
| LightYellow4: "#8b8b7a", | |
| LimeGreen: "#32cd32", | |
| linen: "#faf0e6", | |
| magenta: "#ff00ff", | |
| magenta2: "#ee00ee", | |
| magenta3: "#cd00cd", | |
| magenta4: "#8b008b", | |
| maroon: "#b03060", | |
| maroon1: "#ff34b3", | |
| maroon2: "#ee30a7", | |
| maroon3: "#cd2990", | |
| maroon4: "#8b1c62", | |
| medium: "#66cdaa", | |
| MediumAquamarine: "#66cdaa", | |
| MediumBlue: "#0000cd", | |
| MediumOrchid: "#ba55d3", | |
| MediumOrchid1: "#e066ff", | |
| MediumOrchid2: "#d15fee", | |
| MediumOrchid3: "#b452cd", | |
| MediumOrchid4: "#7a378b", | |
| MediumPurple: "#9370db", | |
| MediumPurple1: "#ab82ff", | |
| MediumPurple2: "#9f79ee", | |
| MediumPurple3: "#8968cd", | |
| MediumPurple4: "#5d478b", | |
| MediumSeaGreen: "#3cb371", | |
| MediumSlateBlue: "#7b68ee", | |
| MediumSpringGreen: "#00fa9a", | |
| MediumTurquoise: "#48d1cc", | |
| MediumVioletRed: "#c71585", | |
| MidnightBlue: "#191970", | |
| MintCream: "#f5fffa", | |
| MistyRose1: "#ffe4e1", | |
| MistyRose2: "#eed5d2", | |
| MistyRose3: "#cdb7b5", | |
| MistyRose4: "#8b7d7b", | |
| moccasin: "#ffe4b5", | |
| NavajoWhite1: "#ffdead", | |
| NavajoWhite2: "#eecfa1", | |
| NavajoWhite3: "#cdb38b", | |
| NavajoWhite4: "#8b795e", | |
| NavyBlue: "#000080", | |
| OldLace: "#fdf5e6", | |
| OliveDrab: "#6b8e23", | |
| OliveDrab1: "#c0ff3e", | |
| OliveDrab2: "#b3ee3a", | |
| OliveDrab4: "#698b22", | |
| orange1: "#ffa500", | |
| orange2: "#ee9a00", | |
| orange3: "#cd8500", | |
| orange4: "#8b5a00", | |
| OrangeRed1: "#ff4500", | |
| OrangeRed2: "#ee4000", | |
| OrangeRed3: "#cd3700", | |
| OrangeRed4: "#8b2500", | |
| orchid: "#da70d6", | |
| orchid1: "#ff83fa", | |
| orchid2: "#ee7ae9", | |
| orchid3: "#cd69c9", | |
| orchid4: "#8b4789", | |
| pale: "#db7093", | |
| PaleGoldenrod: "#eee8aa", | |
| PaleGreen: "#98fb98", | |
| PaleGreen1: "#9aff9a", | |
| PaleGreen2: "#90ee90", | |
| PaleGreen3: "#7ccd7c", | |
| PaleGreen4: "#548b54", | |
| PaleTurquoise: "#afeeee", | |
| PaleTurquoise1: "#bbffff", | |
| PaleTurquoise2: "#aeeeee", | |
| PaleTurquoise3: "#96cdcd", | |
| PaleTurquoise4: "#668b8b", | |
| PaleVioletRed: "#db7093", | |
| PaleVioletRed1: "#ff82ab", | |
| PaleVioletRed2: "#ee799f", | |
| PaleVioletRed3: "#cd6889", | |
| PaleVioletRed4: "#8b475d", | |
| PapayaWhip: "#ffefd5", | |
| PeachPuff1: "#ffdab9", | |
| PeachPuff2: "#eecbad", | |
| PeachPuff3: "#cdaf95", | |
| PeachPuff4: "#8b7765", | |
| pink: "#ffc0cb", | |
| pink1: "#ffb5c5", | |
| pink2: "#eea9b8", | |
| pink3: "#cd919e", | |
| pink4: "#8b636c", | |
| plum: "#dda0dd", | |
| plum1: "#ffbbff", | |
| plum2: "#eeaeee", | |
| plum3: "#cd96cd", | |
| plum4: "#8b668b", | |
| PowderBlue: "#b0e0e6", | |
| purple: "#a020f0", | |
| rebeccapurple: "#663399", | |
| purple1: "#9b30ff", | |
| purple2: "#912cee", | |
| purple3: "#7d26cd", | |
| purple4: "#551a8b", | |
| red1: "#ff0000", | |
| red2: "#ee0000", | |
| red3: "#cd0000", | |
| red4: "#8b0000", | |
| RosyBrown: "#bc8f8f", | |
| RosyBrown1: "#ffc1c1", | |
| RosyBrown2: "#eeb4b4", | |
| RosyBrown3: "#cd9b9b", | |
| RosyBrown4: "#8b6969", | |
| RoyalBlue: "#4169e1", | |
| RoyalBlue1: "#4876ff", | |
| RoyalBlue2: "#436eee", | |
| RoyalBlue3: "#3a5fcd", | |
| RoyalBlue4: "#27408b", | |
| SaddleBrown: "#8b4513", | |
| salmon: "#fa8072", | |
| salmon1: "#ff8c69", | |
| salmon2: "#ee8262", | |
| salmon3: "#cd7054", | |
| salmon4: "#8b4c39", | |
| SandyBrown: "#f4a460", | |
| SeaGreen1: "#54ff9f", | |
| SeaGreen2: "#4eee94", | |
| SeaGreen3: "#43cd80", | |
| SeaGreen4: "#2e8b57", | |
| seashell1: "#fff5ee", | |
| seashell2: "#eee5de", | |
| seashell3: "#cdc5bf", | |
| seashell4: "#8b8682", | |
| sienna: "#a0522d", | |
| sienna1: "#ff8247", | |
| sienna2: "#ee7942", | |
| sienna3: "#cd6839", | |
| sienna4: "#8b4726", | |
| SkyBlue: "#87ceeb", | |
| SkyBlue1: "#87ceff", | |
| SkyBlue2: "#7ec0ee", | |
| SkyBlue3: "#6ca6cd", | |
| SkyBlue4: "#4a708b", | |
| SlateBlue: "#6a5acd", | |
| SlateBlue1: "#836fff", | |
| SlateBlue2: "#7a67ee", | |
| SlateBlue3: "#6959cd", | |
| SlateBlue4: "#473c8b", | |
| SlateGray: "#708090", | |
| SlateGray1: "#c6e2ff", | |
| SlateGray2: "#b9d3ee", | |
| SlateGray3: "#9fb6cd", | |
| SlateGray4: "#6c7b8b", | |
| snow1: "#fffafa", | |
| snow2: "#eee9e9", | |
| snow3: "#cdc9c9", | |
| snow4: "#8b8989", | |
| SpringGreen1: "#00ff7f", | |
| SpringGreen2: "#00ee76", | |
| SpringGreen3: "#00cd66", | |
| SpringGreen4: "#008b45", | |
| SteelBlue: "#4682b4", | |
| SteelBlue1: "#63b8ff", | |
| SteelBlue2: "#5cacee", | |
| SteelBlue3: "#4f94cd", | |
| SteelBlue4: "#36648b", | |
| tan: "#d2b48c", | |
| tan1: "#ffa54f", | |
| tan2: "#ee9a49", | |
| tan3: "#cd853f", | |
| tan4: "#8b5a2b", | |
| thistle: "#d8bfd8", | |
| thistle1: "#ffe1ff", | |
| thistle2: "#eed2ee", | |
| thistle3: "#cdb5cd", | |
| thistle4: "#8b7b8b", | |
| tomato1: "#ff6347", | |
| tomato2: "#ee5c42", | |
| tomato3: "#cd4f39", | |
| tomato4: "#8b3626", | |
| turquoise: "#40e0d0", | |
| turquoise1: "#00f5ff", | |
| turquoise2: "#00e5ee", | |
| turquoise3: "#00c5cd", | |
| turquoise4: "#00868b", | |
| violet: "#ee82ee", | |
| VioletRed: "#d02090", | |
| VioletRed1: "#ff3e96", | |
| VioletRed2: "#ee3a8c", | |
| VioletRed3: "#cd3278", | |
| VioletRed4: "#8b2252", | |
| wheat: "#f5deb3", | |
| wheat1: "#ffe7ba", | |
| wheat2: "#eed8ae", | |
| wheat3: "#cdba96", | |
| wheat4: "#8b7e66", | |
| white: "#ffffff", | |
| WhiteSmoke: "#f5f5f5", | |
| yellow1: "#ffff00", | |
| yellow2: "#eeee00", | |
| yellow3: "#cdcd00", | |
| yellow4: "#8b8b00", | |
| YellowGreen: "#9acd32" | |
| } | |
| struct NamedTuple(T) | |
| macro fetch_trie_expand(keys, index, size) | |
| {% if keys.size < 16 %} | |
| {% for key in keys %} | |
| return self[{{key}}] if {{key}} == key | |
| {% end %} | |
| {% else %} | |
| {% chars = keys.map {|key| key.chars[index] }.uniq %} | |
| case key[{{index}}] | |
| {% for char in chars %} | |
| when {{char}} | |
| {% subkeys = keys.select {|key| key.chars[index] == char } %} | |
| {% if index+1 == size %} | |
| {% ans = subkeys[0] %} | |
| {% if ans %} | |
| return self[{{ans.id.symbolize}}] | |
| {% end %} | |
| {% else %} | |
| fetch_trie_expand({{subkeys}}, {{index+1}}, {{size}}) | |
| {% end %} | |
| {% end %} | |
| end | |
| {% end %} | |
| end | |
| def fetch1(key : String, &block) | |
| {% for key in T %} | |
| return self[{{key.symbolize}}] if {{key.stringify}} == key | |
| {% end %} | |
| yield | |
| end | |
| def fetch2(key : String, &block) | |
| {% begin %} | |
| {% keys = T.keys.map(&.stringify) %} | |
| {% sizes = keys.map(&.size).uniq %} | |
| case key.size | |
| {% for size in sizes %} | |
| when {{size}} | |
| fetch_trie_expand({{ keys.select {|key| key.size == size} }}, 0, {{size}}) | |
| {% end %} | |
| end | |
| {% end %} | |
| yield | |
| end | |
| end | |
| require "benchmark" | |
| keys = {{COLORS.keys.map(&.stringify)}} | |
| glob = "" | |
| Benchmark.ips do |x| | |
| x.report("check every key") do | |
| keys.each {|key| 1000.times {glob = COLORS.fetch1(key) {nil}}} | |
| end | |
| x.report("trie lookup") do | |
| keys.each {|key| 1000.times {glob = COLORS.fetch2(key) {nil}}} | |
| end | |
| end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment