自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

通過(guò)添加一些gems來(lái)提升Rails應(yīng)用的性能

大數(shù)據(jù)
使用Rails一段時(shí)間之后,你可能就會(huì)開(kāi)始吹毛求疵的想要提高它性能。這是一系列文章中第一次考慮如何提高(即使微不足道的)Rails的性能。

使用Rails一段時(shí)間之后,你可能就會(huì)開(kāi)始吹毛求疵的想要提高它性能。這是一系列文章中第一次考慮如何提高(即使微不足道的)Rails的性能。

我將會(huì)關(guān)注在一些gem的提速上面,在某些情況下,可能是一小部分的Rails,如html轉(zhuǎn)義,String.blank?和JSON工具類。

基準(zhǔn)原則

原則,對(duì)于僅僅在控制臺(tái)wrk運(yùn)行幾次來(lái)講,是一個(gè)與其過(guò)強(qiáng)的詞語(yǔ),但是我這里不是來(lái)尋找“圣杯”的,而是提供一些初始的想法。

我將從舊的apache ab切換到wrk。

wrk是現(xiàn)代的 HTTP 基準(zhǔn)工具,當(dāng)在一個(gè)單一的多核 CPU 上運(yùn)行時(shí),能夠產(chǎn)生巨大的負(fù)載。

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

這條指令運(yùn)行基準(zhǔn)問(wèn)題10s,使用10個(gè)線程,并且保持打開(kāi)50個(gè)HTTP鏈接,也就是說(shuō),這樣就足夠了。記得將這些基準(zhǔn)測(cè)試在你實(shí)際的應(yīng)用中跑一下,看一下實(shí)際上的性能提高有多少。

escape_utils gem

通過(guò)可愛(ài)的escape_utils gem可以加快HTML的轉(zhuǎn)義。為了使其能夠在Rails中使用,需要添加一個(gè)初始值設(shè)定來(lái)解決:

  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 

對(duì)該邏輯進(jìn)行測(cè)試的用例:

  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  

使用標(biāo)準(zhǔn)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?方法太慢?不用多說(shuō),試一下fast_blank gem!

僅需要在你的Gemfile中添加gem 'fast_blank',這應(yīng)該就可以非常漂亮的提高像這篇文章中提到的String.black?方法的速度。為了測(cè)試,我僅添加下倆代碼:

fast_blank是一個(gè)簡(jiǎn)單的擴(kuò)展,提供了一個(gè)支持String.blank?功能的快速實(shí)現(xiàn)。

  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  

#p#

使用標(biāo)準(zhǔn)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 

這個(gè)測(cè)試用例非常簡(jiǎn)單,僅僅將所有的article序列化為JSON格式:

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

使用標(biāo)準(zhǔn)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

好吧,這其實(shí)不是一個(gè)真正的gem,如果你想深入探究它,可以看我的這篇文章。在初始測(cè)試時(shí),jemalloc并沒(méi)有產(chǎn)生太多性能的提升,至少對(duì)我使用的測(cè)試用例是這樣的。

提示:某些情況下,可能會(huì)默認(rèn)包含在Ruby中。

更新:請(qǐng)一定嘗試一下kzk的jemalloc gem

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

深入探究你的Rails應(yīng)用

不要擔(dān)心,去用一下Sam Saffron的帶有非常棒的FlameGraphsMiniProfiler吧!

結(jié)語(yǔ)

鑒于你的應(yīng)用要做什么,你可能想為你的Gemfile添加上述的一些gem。通常我會(huì)把他們都添加上,當(dāng)然是出于一個(gè)好的估量(你可能會(huì)想檢查你的RAM利用率,然后在添加之前,進(jìn)行一個(gè)完整的測(cè)試)。

oj gem基于JSON API,對(duì)Rails來(lái)說(shuō)是非常不錯(cuò)的,使用oj gem,你可以刪除視圖并僅使用代言人或者你選擇的模式進(jìn)行序列化。

英文原文:Improve Rails performance by adding a few gems

責(zé)任編輯:林師授 來(lái)源: 開(kāi)源中國(guó)社區(qū) 編譯
相關(guān)推薦

2018-02-06 11:10:27

iOS開(kāi)發(fā)Xcode快捷鍵

2021-04-09 10:26:43

Python編程技術(shù)

2011-03-15 17:46:43

2015-01-21 15:40:44

GoRuby

2014-03-26 10:00:06

RailsRails性能

2018-02-04 22:29:21

iOS開(kāi)發(fā)

2011-03-11 09:27:11

Java性能監(jiān)控

2019-09-17 09:21:01

2018-06-14 09:35:35

2021-06-10 10:02:19

優(yōu)化緩存性能

2017-02-21 13:36:11

iosAPP性能

2016-01-04 11:04:17

Web開(kāi)發(fā)Ruby

2011-08-31 10:54:25

Java性能

2010-03-24 18:27:27

無(wú)線mesh網(wǎng)絡(luò)應(yīng)用

2009-07-01 16:20:34

Flex垃圾回收性能優(yōu)化

2021-02-24 15:16:45

微服務(wù)架構(gòu)數(shù)據(jù)

2010-08-05 13:54:36

NFS協(xié)議

2021-02-06 14:25:29

Java延遲加載代碼

2010-05-25 17:00:04

Java WebWeb容器Web應(yīng)用

2013-08-27 13:24:46

App Store應(yīng)用上傳應(yīng)用截圖ASO應(yīng)用商店優(yōu)化
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)