使用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中使用,需要添加一个初始值设定来解决: 2 | require 'escape_utils/html/rack' |
3 | require 'escape_utils/html/erb' |
4 | require 'escape_utils/html/cgi' |
5 | require 'escape_utils/html/haml' |
7 | Rails.logger.info 'Escape_utils is not in the gemfile' |
对该逻辑进行测试的用例: 03 | <body class = "application articles_show" > |
04 | <!-- Responsive navigation |
05 | ==================================================== --> |
06 | <div class = "container" > |
09 | <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> |
17 | <a href= "#" class = "ss-standard ss-list" id= "nav-toggle" aria-hidden= "true" ></a> |
20 | render inline: "Hello world <%= @escape_me %>" |
使用标准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 |
使用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 |
fast_blank gem 是否在印象里,blank?方法太慢?不用多说,试一下fast_blank gem! 仅需要在你的Gemfile中添加gem 'fast_blank',这应该就可以非常漂亮的提高像这篇文章中提到的String.black?方法的速度。为了测试,我仅添加下俩代码: fast_blank是一个简单的扩展,提供了一个支持String.blank?功能的快速实现。 08 | " this is a longer test" , |
09 | " this is a longer test |
13 | this is a longer test" |
18 | x.report( "Fast Blank #{s.length} :" ) do |
使用标准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 |
使用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 |
|