Speed up attribute lookup#651
Conversation
| defp get_value(attr_name, attributes) do | ||
| Enum.find_value(attributes, "", fn | ||
| defp get_value(attr_name, attributes) when is_list(attributes) do | ||
| case List.keyfind(attributes, attr_name, 0) do |
There was a problem hiding this comment.
How much of the improvements came from this change?
If is not that much, I would prefer to keep the Enum.find_value/3 just because it's easier to read and maintain.
There was a problem hiding this comment.
I just ran the benchmarks back and forth changing this part only and it's faster in all cases, the biggest win in speedup is that it's ~11% faster in the "exact_attribute" case but most significantly it halves the memory usage in the "exact_attribute" and in the "attribute_includes" cases.
I believe this library is used heavily by a lot of companies where every speedup has a huge effect on throughput.
That is the case for our company.
There was a problem hiding this comment.
OK, that's fair. Thank you for the research and explanation!
Improvements:
exact attribute => ~5% faster, ~50% lower memory usage
attribute present => ~10% faster, ~40% lower memory usage
attribute includes => ~100% faster, ~60% lower memory usage
This change utilizes more built in functions instead of
Enumand usesString.contains?to check for match before performingString.split.