We’ve already discussed why choosing the Ruby on Rails framework for your app is a good idea. Ruby on Rails (or RoR) is extremely popular as it speeds up development. This framework provides developers with a great collection of libraries.
But just choosing Ruby on Rails doesn’t mean your project will succeed. To meet users’ expectations, your Ruby on Rails app should be fast. What do we mean by fast? A study by Akami shows that over half of internet users expect a website to load within two seconds. And around three-quarters of web users won’t return to a website if it takes longer than four seconds to load.
Speed really matters. The performance of an application is crucial, as it plays an important role in making your web application successful. Poor performance can decrease an app’s ratings. So, how to improve the performance of an app?
Ruby on Rails app performance optimization tips
Let’s see what you can do to optimize the performance of a Ruby on Rails app and ensure its speed optimization.
Choose your web hosting provider wisely
Web hosts offer important services like server management and backups. Choosing the right web hosting provider isn’t only important for Ruby on Rails apps, as your web host influences the speed of any application. Different hosting packages provide different features.
Consider either cloud hosting, a virtual private server (VPS), or dedicated hosting. Cloud hosting offers flexible and scalable platforms that are reliable and efficient. With cloud hosting, your hardware is virtual. This is quite cost-efficient, as you don’t pay for a real server.
Dedicated hosting offers a dedicated physical server. This means there are no other users’ accounts on your server and you get full control over it. This solution best fits enterprise-grade projects and high-load web applications where speed is crucial.
A virtual private server offers clients a share of a physical server. With VPS, clients pay for the hardware resources they use. This type of hosting is more affordable and is a good choice for websites with average traffic.
[Comparison of cloud hosting, VPS, and dedicated hosting]
Now let’s check what hosting providers are on the market now. If you need thorough control over your Ruby on Rails deployment, consider choosing providers like AmazonWeb Services or the Google Cloud Platform. These are reliable and scalable solutions. But note that when using these hosting providers, you’ll have to hire administrators to configure your network and storage as well as a DevOps specialist to manage the environment and deployment.
On the other hand, there are solutions like Heroku that allow your Ruby on Rails app to launch faster. With Heroku, it’s easy to launch applications by uploading them from your Git repository. This option provides less control, though.
Digital Ocean is a good choice for those who need a high level of control over their servers. Digital Ocean solves the problem of managing different cloud services by offering bundles called Droplets. Droplets are scalable computing platforms with add-on storage, security, and monitoring capabilities to easily run production applications.
Eliminate the N+1 query problem
One of the most frequent causes of slow performance is the N+1 query problem faced by most Ruby on Rails applications. This refers to instances in which one line of code results in many more queries than expected. As the project becomes bigger, this problem only compounds. You may find out that your project is running lots of queries to achieve one result rather than running one query with many results.
To boost up the performance of a Ruby on Rails application, you need to cut down on the number of independent database queries. Now you’re probably wondering how to fix this problem. The answer is to use eager loading associated relations. That means you should collect related data with one query. It’s important that developers understand this performance issue and are aware of newly introduced queries that can be optimized.
Reducing N+1 queries is significant. But it may be quite difficult to identify N+1 problems when your project scales. You may only detect these database performance issues when moving to a production-sized database. And even when paying close attention, errors can still sneak into production code. That’s why we advise using the Bullet gem, which identifies and reports N+1 queries. Sometimes it can fail to identify N+1 problems or report queries that don’t have problems, however.
Gems and plugins are your friends
Among the many ways to speed up RoR-based web apps, a common one is using different gems and plugins that speed up projects and solve problems while building your app. But gems and plugins can speed up your app only as long as you don’t use too many of them. We’ve already mentioned that using the Bullet gem solves the N+1 problem that most Ruby on Rails applications face. But there are other useful gems and plugins that can help with optimization of RoR code.
Some gems and plugins solve common problems in Ruby on Rails applications so developers don’t have to create solutions from scratch. Gems and plugins handle issues connected with APIs, security, Active Record, testing, debugging, deployment, payments, authentication, authorization, and other things.
But don’t forget that lavish use of gems and plugins means there is more code to process and it takes more time. With too many gems and plugins, Ruby on Rails apps become larger than they have to be, slowing down performance. Check twice to make sure that the gems and plugins you’re going to use won’t affect performance.
Use background processing
To improve the performance of your Ruby on Rails application, it’s important to use background processing. Background processes can calculate statistics, process video, send emails, run reports, and do lots of other things. These scheduled tasks run periodically during the day. Optimize these processes so that they’re handled automatically. Background processes shouldn’t slow down the application response.
There are tools created especially for the Ruby on Rails framework that help to manage background jobs. The ones we use are the Clockwork and Sidekiq gems. Clockwork is a cron replacement. It runs as a lightweight Ruby process that schedules recurring work for a specific time and date.
Sidekiq is one of the most popular Ruby background job frameworks. It uses Redis as its job management store, leveraging its speed. Sidekiq provides a dashboard that shows all your job queues and their processing states. The Sidekiq framework is open source, but it also offers paid versions — Sidekiq Pro and Sidekiq Enterprise — that provide additional features including periodic scheduled jobs and unique jobs.
Use a content delivery network (CDN)
[How CDN works]
A CDN ensures app performance tuning and that users download data from the server that is closest geographically. Content delivery networks are paid third-party services. There are expensive CDNs for enterprise-level projects as well as cheaper solutions for small and medium-sized websites.
One popular CDN is Amazon CloudFront. It’s built on the global AWS infrastructure that currently includes 54 Availability Zones within 18 geographic regions. CloudFront is a secure CDN that provides network- and application-level protection.
Add indexes to your database
Your app may slow down when it gets more traffic because database tables expand, slowing down lookups. To fix this problem you can add indexes to your database. Actually, a lack of indexes on columns is one of the reasons why some queries take way longer to execute than they should.
When creating a database column, it’s important to take into account if you’ll need to find and retrieve data based on this column. Without indexes, the database engine will check every record in the table until it finds a match. With indexes, the lookup will be a lot faster, as the engine will check only specific records. Before adding an index, it’s important to know whether searches or updates will be performed more often. Indexes speed up searches but slow down updates.
It’s also important to add indexes on foreign keys, joint tables, and polymorphic relationships for faster lookup. When you need to remove an index and a table at the same time, remember that it’s crucial to remove the index first.
To build a fast Ruby on Rails application that satisfies users, focus on choosing solutions that fit your project. Select a proper web hosting provider and consider using a CDN to ensure great performance in different geographical regions. Make complex operations asynchronous and move them to background jobs to speed up your app. And don’t forget about useful plugins and gems like Bullet to solve common speed problems. Don’t use too many of them, though. These general performance tips can help you to speed up Ruby on Rails apps. If you have any questions about building Ruby on Rails projects, don’t hesitate to contact us.