Achieving Performance with Memoization

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:

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.