通过添加一些gems来提升Rails应用的性能

使用Rails一段时间之后,你可能就会开始吹毛求疵的想要提高它性能。这是一系列文章中第一次考虑如何提高(即使微不足道的)Rails的性能。

我将会关注在一些gem的提速上面,在某些情况下,可能是一小部分的Rails,如html转义,String.blank?和JSON工具类。

基准原则

原则,对于仅仅在控制台wrk运行几次来讲,是一个与其过强的词语,但是我这里不是来寻找“圣杯”的,而是提供一些初始的想法。

我将从旧的apache ab切换到wrk

wrk是现代的 HTTP 基准工具,当在一个单一的多核 CPU 上运行时,能够产生巨大的负载。


  1. wrk -t10 -c10 -d10s http://localhost:3000 

这条指令运行基准问题10s,使用10个线程,并且保持打开50个HTTP链接,也就是说,这样就足够了。记得将这些基准测试在你实际的应用中跑一下,看一下实际上的性能提高有多少。

escape_utils gem

通过可爱的escape_utils gem可以加快HTML的转义。为了使其能够在Rails中使用,需要添加一个初始值设定来解决:


  1. begin  
  2.   require 'escape_utils/html/rack' # to patch Rack::Utils  
  3.   require 'escape_utils/html/erb' # to patch ERB::Util  
  4.   require 'escape_utils/html/cgi' # to patch CGI  
  5.   require 'escape_utils/html/haml' # to patch Haml::Helpers  
  6. rescue LoadError  
  7.   Rails.logger.info 'Escape_utils is not in the gemfile' 
  8. end 

对该逻辑进行测试的用例:


  1. def escape_utils  
  2.   @escape_me = <<-HTML  
  3.     <body class="application articles_show">  
  4.       <!-- Responsive navigation  
  5.       ==================================================== -->  
  6.       <div class="container">  
  7.         <nav id="nav">  
  8.       <ul>  
  9.         <li><a href="/"><i class="ss-standard ss-home"></i>home</a></li>  
  10.         <li><a href="/home/about"><i class="ss-standard ss-info"></i>about</a></li>  
  11.         <li><a href="/contact"><i class="ss-standard ss-ellipsischat"></i>contact</a></li>  
  12.         <li><a href="/home/projects"><i class="ss-standard ss-fork"></i>projects</a></li>  
  13.         <li><a href="/tags"><i class="ss-standard ss-tag"></i>tags</a></li>  
  14.         <li><a href="/articles?query=code"><i class="ss-standard ss-search"></i>search</a></li>  
  15.       </ul>  
  16.     </nav>  
  17.     <a href="#" class="ss-standard ss-list" id="nav-toggle" aria-hidden="true"></a>  
  18.   HTML  
  19.  
  20.   render inline: "Hello  world <%= @escape_me %>" 
  21. end  

使用标准Rails:


  1. Running 10s test @ http://localhost:3000/sidechannels/bench  
  2.   2 threads and 10 connections  
  3.   Thread Stats   Avg      Stdev     Max   +/- Stdev  
  4.     Latency    35.40ms    3.55ms  64.70ms   91.98%  
  5.     Req/Sec   142.19     11.68   164.00     83.12%  
  6.   2837 requests in 10.00s, 4.92MB read  
  7. Requests/sec:    283.61  
  8. Transfer/sec:    503.34KB  

使用escape_utils gem:


  1. Running 10s test @ http://localhost:3000/sidechannels/bench  
  2.   2 threads and 10 connections  
  3.   Thread Stats   Avg      Stdev     Max   +/- Stdev  
  4.     Latency    34.06ms    3.89ms  63.92ms   89.10%  
  5.     Req/Sec   148.65     13.36   180.00     75.94%  
  6.   2960 requests in 10.00s, 5.46MB read  
  7. Requests/sec:    295.98  
  8. Transfer/sec:    558.72KB 

fast_blank gem

是否在印象里,blank?方法太慢?不用多说,试一下fast_blank gem!

仅需要在你的Gemfile中添加gem 'fast_blank',这应该就可以非常漂亮的提高像这篇文章中提到的String.black?方法的速度。为了测试,我仅添加下俩代码:

fast_blank是一个简单的扩展,提供了一个支持String.blank?功能的快速实现。


  1. def fast_blank_test  
  2.    n = 1000  
  3.  
  4.    strings = [  
  5.      "",  
  6.      "\r\n\r\n  ",  
  7.      "this is a test",  
  8.      "   this is a longer test",  
  9.      "   this is a longer test  
  10.      this is a longer test  
  11.      this is a longer test  
  12.      this is a longer test  
  13.      this is a longer test"  
  14.    ]  
  15.  
  16.    Benchmark.bmbm  do |x|  
  17.      strings.each do |s|  
  18.        x.report("Fast Blank #{s.length}    :") do 
  19.          n.times { s.blank? }  
  20.        end  
  21.      end  
  22.    end  
  23.  
  24.    render nothing: true 
  25.  end  

使用标准Rails:


  1. Running 10s test @ http://localhost:3000/sidechannels/bench  
  2.   2 threads and 10 connections  
  3.   Thread Stats   Avg      Stdev     Max   +/- Stdev  
  4.     Latency     1.40s   207.72ms   1.58s    92.68%  
  5.     Req/Sec     3.10      2.11     6.00     53.66%  
  6.   69 requests in 10.01s, 33.08KB read  
  7. Requests/sec:      6.90  
  8. Transfer/sec:      3.31KB 

使用fast_blank gem:


  1. Running 10s test @ http://localhost:3000/sidechannels/bench  
  2.   2 threads and 10 connections  
  3.   Thread Stats   Avg      Stdev     Max   +/- Stdev  
  4.     Latency     1.33s   179.56ms   1.41s    93.33%  
  5.     Req/Sec     3.07      0.80     4.00     40.00%  
  6.   72 requests in 10.00s, 34.52KB read  
  7. Requests/sec:      7.20  
  8. Transfer/sec:      3.45KB 

oj gem


  1. # oj gem  
  2. gem 'oj' 
  3. gem 'oj_mimic_json' # we need this for Rails 4.1.x 

这个测试用例非常简单,仅仅将所有的article序列化为JSON格式:


  1. class SidechannelsController < ApplicationController  
  2.   def oj  
  3.     render json: Article.all  
  4.   end  
  5. end 

使用标准Rails序列化器:


  1. Running 10s test @ http://localhost:3000/sidechannels/bench  
  2.   2 threads and 10 connections  
  3.   Thread Stats   Avg      Stdev     Max   +/- Stdev  
  4.     Latency   108.37ms    5.12ms 134.90ms   83.33%  
  5.     Req/Sec    45.76      3.60    55.00     57.69%  
  6.   922 requests in 10.00s, 57.41MB read  
  7. Requests/sec:     92.17  
  8. Transfer/sec:      5.74MB 

使用oj gem:


  1. Running 10s test @ http://localhost:3000/sidechannels/bench  
  2.   2 threads and 10 connections  
  3.   Thread Stats   Avg      Stdev     Max   +/- Stdev  
  4.     Latency    78.06ms    4.43ms  92.83ms   81.31%  
  5.     Req/Sec    63.64      5.33    71.00     64.49%  
  6.   1277 requests in 10.00s, 79.83MB read  
  7. Requests/sec:    127.65  
  8. Transfer/sec:      7.98MB 

使用jemalloc

好吧,这其实不是一个真正的gem,如果你想深入探究它,可以看我的这篇文章。在初始测试时,jemalloc并没有产生太多性能的提升,至少对我使用的测试用例是这样的。

提示:某些情况下,可能会默认包含在Ruby中。

更新:请一定尝试一下kzk的jemalloc gem


  1. gem install jemalloc  
  2. je -v rails s 

深入探究你的Rails应用

不要担心,去用一下Sam Saffron的带有非常棒的FlameGraphsMiniProfiler吧!

结语

鉴于你的应用要做什么,你可能想为你的Gemfile添加上述的一些gem。通常我会把他们都添加上,当然是出于一个好的估量(你可能会想检查你的RAM利用率,然后在添加之前,进行一个完整的测试)。

oj gem基于JSON API,对Rails来说是非常不错的,使用oj gem,你可以删除视图并仅使用代言人或者你选择的模式进行序列化。

本文作者:佚名

来源:51CTO

时间: 2024-11-01 06:10:02

通过添加一些gems来提升Rails应用的性能的相关文章

通过添加一些 gems 来提升 Rails 应用的性能 【已翻译100%】

使用Rails一段时间之后,你可能就会开始吹毛求疵的想要提高它性能.这是一系列文章中第一次考虑如何提高(即使微不足道的)Rails的性能. 我将会关注在一些gem的提速上面,在某些情况下,可能是一小部分的Rails,如html转义,String.blank?和JSON工具类. 基准原则 原则,对于仅仅在控制台wrk运行几次来讲,是一个与其过强的词语,但是我这里不是来寻找"圣杯"的,而是提供一些初始的想法. 我将从旧的apache ab切换到wrk. wrk是现代的 HTTP 基准工具,

提升Android应用开发性能的10大要点

虽然Android智能手机和平板电脑的速度一天比一天快,但是开发者必须记住一点:他们开发的应用程序仍在一种资源紧张的环境下运行,这种环 境主要依赖性能与最新的台式机或笔记本电脑无法比拟的电池和处理器.下面介绍的一些方法可以帮助你的应用程序"瘦身"或者说"Android提升开发性能 十大要点",以便它们在今天和明天的Android设备上最顺畅地运行. 先来说说确保应用程序响应迅即的几个编程要点. 第一个要点:首先要有良好的编程习惯 要成为一名优秀的资源管理员;既要运用

云服务器 ECS 配置:利用MySQL读写分离,提升应用数据吞吐性能

利用MySQL读写分离,提升应用数据吞吐性能 背景 一般情况下,对数据库的读和写都在同一个数据库服务器中操作时,业务系统性能会降低.为了提升业务系统性能,优化用户体验,可以通过读写分离来减轻主数据库的负载.本篇文章分别从应用层和系统层来介绍读写分离的实现方法. 应用层实现方法: 应用层中直接使用代码实现,在进入Service之前,使用AOP来做出判断,是使用写库还是读库,判断依据可以根据方法名判断,比如说以query.find.get等开头的就走读库,其他的走写库. 优点: 1.多数据源切换方便

提升Android应用开发性能的十大要点

虽然Android智能手机和平板电脑的速度一天比一天快,但是开发者必须记住一点:他们开发的应用程序仍在一种资源紧张的环境下运行,这种环境主要依赖性能与最新的台式机或笔记本电脑无法比拟的电池和处理器.下面介绍的一些方法可以帮助你的应用程序"瘦身"或者说"Android提升开发性能十大要点",以便它们在今天和明天的Android设备上最顺畅地运行. 先来说说确保应用程序响应迅即的几个编程要点. 第一个要点:首先要有良好的编程习惯 要成为一名优秀的资源管理员;既要运用常识

[译]如何运用最新的技术提升网页速度和性能

本文讲的是[译]如何运用最新的技术提升网页速度和性能, 原文链接 : Why our website is faster than yours 原文作者 : by Declan 译文出自 : 掘金翻译计划 译者 : hpoenixf 校对者: MAYDAY1993,circlelove 我们最近升级了我们的网站.虽然这主要是界面方面的大调整,但作为一个软件开发者,我们更关注在技术细节上面.我们的目标是加强控制,关注性能,在未来可以灵活地调整和让在网站上撰写内容变得有趣.下面讲述了我们是如何让我们

求助各位大神如何提升sqlserver分区表的性能?

问题描述 求助各位大神如何提升sqlserver分区表的性能? 本人最近项目需要,需要对某个大数据量表进行分区. oracle数据库上分区非常成功,性能提升很大,但是sqlserver数据库上分区之后感觉效率提升微乎其微 具体操作步骤如下: 建立分区函数 创建文件组 创建表结构 备份原有表,重新建表 建立对应的维护分区的存储过程 建立对应执行存储过程的job 对表建立索引,索引也有分区 执行完毕之后查看数据也都有分到相应分区,但是在界面上执行查询的速度还是很慢,在原有的查询速度上仅仅提升了2,3

智能SQL优化工具--SQL Optimizer for SQL Server(帮助提升数据库应用程序性能,最大程度地自动优化你的SQL语句 )

原文:智能SQL优化工具--SQL Optimizer for SQL Server(帮助提升数据库应用程序性能,最大程度地自动优化你的SQL语句 ) SQL Optimizer for SQL Server 帮助提升数据库应用程序性能,最大程度地自动优化你的SQL语句   SQL Optimizer for SQL Server 让 SQL Server DBA或者T-SQL开发人员能够主动地识别潜在的SQL性能问题,通过扫描和分析SQL语句进行人工智能自动SQL优化.Dell SQL Opt

Sybase大数据分析提升日本桥梁安全性能

本文讲的是Sybase大数据分析提升日本桥梁安全性能,2012年2月27日消息,Sybase公司近日宣布,全球IT服务提供商NTT Data通过使用Sybase领先的复杂事件处理(CEP)和分析平台--Sybase Aleri Streaming Processor (ESP)和Sybase RAP--进行大数据集的实时分析,以改进NTT Data的桥梁监控系统.凭借Sybase分析平台,NTT Data在快速分析大而复杂的数据集(特别是在高峰期)方面的能力得到了增强. NTT Data的监控系

Teradata提升JSON数据查询性能

文章讲的是Teradata提升JSON数据查询性能,为帮助业务用户从JavaScript Object Notion(JSON)数据中更快地获得洞察力,Teradata天睿公司宣布,首次在同一数据库实现三大JSON数据格式的原生存储,这将为客户提供更强的查询性能.本次Teradata数据库升级将帮助业务用户充分利用网页应用.传感器和物联网(IoT)机器生成JSON数据的商业价值. 目前,Teradata天睿公司为客户提供以下三种格式选择:最适于多种形式数据以BSON格式存储的JSON数据.专为数