How we made a Ruby method 200x faster
campsite.com
How we made a Ruby method 200x faster
1–10 of 48 posts
Re: How we made a Ruby method 200x faster
#2Going from
HANDLERS = [
Text,
List,
ListItem,
Code,
# ...
].freeze
to HANDLERS_BY_NODE_NAMES = [
Text,
List,
ListItem,
Code,
# ...
].each_with_object({}) do |handler, result|
handler::NODE_NAMES.each { |node_name| result[node_name] = handler }
end.freezeRe: How we made a Ruby method 200x faster
#3Re: How we made a Ruby method 200x faster
#4That's a huge improvement but damn, the fixed code didn't look any better in my eyes. Going from HANDLERS = [ Text, List, ListItem, Code, # ... ].freeze to HANDLERS_BY_NODE_NAMES = [ Text, List, ListItem, Code, # ... ].each_with_object({}) do |handler, result| handler::NODE_NAMES.each { |node_name| result[node_name] = handler } end.freeze
BY_NODE_NAMES = HANDLERS.map {|h|
h::NODE_NAMES.map {|n| [n, h]}
}.flatten(1).to_hRe: How we made a Ruby method 200x faster
#5That's a huge improvement but damn, the fixed code didn't look any better in my eyes. Going from HANDLERS = [ Text, List, ListItem, Code, # ... ].freeze to HANDLERS_BY_NODE_NAMES = [ Text, List, ListItem, Code, # ... ].each_with_object({}) do |handler, result| handler::NODE_NAMES.each { |node_name| result[node_name] = handler } end.freeze
Re: How we made a Ruby method 200x faster
#6That's a huge improvement but damn, the fixed code didn't look any better in my eyes. Going from HANDLERS = [ Text, List, ListItem, Code, # ... ].freeze to HANDLERS_BY_NODE_NAMES = [ Text, List, ListItem, Code, # ... ].each_with_object({}) do |handler, result| handler::NODE_NAMES.each { |node_name| result[node_name] = handler } end.freeze
Re: How we made a Ruby method 200x faster
#7Re: How we made a Ruby method 200x faster
#8"Use the index, Luke".
Also don't replace string comparison with CSS selector search and expect it to be fast.
Re: How we made a Ruby method 200x faster
#9That's a huge improvement but damn, the fixed code didn't look any better in my eyes. Going from HANDLERS = [ Text, List, ListItem, Code, # ... ].freeze to HANDLERS_BY_NODE_NAMES = [ Text, List, ListItem, Code, # ... ].each_with_object({}) do |handler, result| handler::NODE_NAMES.each { |node_name| result[node_name] = handler } end.freeze
A bigger question for me would be why the handlers don’t register themselves. It should be a very small amount of meta-programmation, and would avoid having to repeat the handlers to register them.