Building performant web applications is crucial so while Rails provides a robust framework, optimizing every piece of code is essential for a smooth user experience. This is where memoization comes in, a powerful technique to enhance your Rails app’s speed and efficiency. In scenarios with frequent database queries, it’s a straightforward yet impactful technique for boosting overall performance.
How memoization works
Memoization works by caching the results of a method call. The first time the method is called, the calculation is performed and the result is stored in a cache. Subsequent calls to the method return the cached value, rather than recalculating the result.
Study case
Let’s say we have a Rails application that allows hosts to invite people to stay at their homes and care for their pets. The hosts have a limited number of invitations per month. Because of that, we created a method called current_month_invites_count
that retrieves the number of application invites done this month by the current host.
Original version
The original version of the method performs a database query every time it is called. This can be inefficient if the method is called frequently, especially if the database query is expensive. The code triggers a database query on each function call, potentially leading to redundant queries.
1
2
3
def current_month_invites_count
invitations.where(created_at: Date.current.beginning_of_month..Date.current.end_of_month).count
end
Memoized version
The memoized version of the method uses the ||=
operator to check whether the result has already been calculated. The first call fetches the count from the database and stores it in the variable. Subsequent calls return the cached value, eliminating the need for repetitive database queries.
1
2
3
def current_month_invites_count
@current_month_invites_count ||= invitations.where(created_at: Date.current.beginning_of_month..Date.current.end_of_ onth).count
end
Benefits of memoization
There are several benefits to using memoization in Rails applications:
Increased performance: reducing the number of database queries that need to be performed, significantly improving performance
Reduced database load: another way to improve performance is by reducing the load on the database
Improved scalability: it improves scalability by reducing the number of database queries that need to be performed.
Simplified code: by eliminating the need to duplicate calculations, memoization can help simplify code
When to use memoization
Not all methods are suitable for memoization. In general, you should consider memoizing methods that meet the following criteria:
- The calculation is expensive or time-consuming.
- The method is called frequently.
- The input data is stable.
In conclusion, memoization is beneficial when the function is called multiple times within the same context, reducing the overhead of redundant database queries and improving overall performance.