Skip to content

Instantly share code, notes, and snippets.

@lbguilherme
Created August 19, 2016 12:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save lbguilherme/c7249c408d2a226bdbb6892dda5e9ab2 to your computer and use it in GitHub Desktop.
Save lbguilherme/c7249c408d2a226bdbb6892dda5e9ab2 to your computer and use it in GitHub Desktop.
check every key 5.14 (± 2.82%) 16.03× slower
trie lookup 82.47 (± 1.80%) fastest
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