Railsで作っているアプリの本番サーバのRailsログを読んでいた時に、大した処理もしていなさそうなのにレンダリングに200msもかかっているパーシャルがあった。
結論
HAMLにはfilterという機能があって、直接CoffeeScript、JavaScirpt、他にも色々な言語を直接HAML内に書くことができる。
結論を言ってしまうと、そのレンダリングに時間のかかるパーシャルの中で使われていたCoffeeScriptのフィルタが怪しいなぁと思い、そのCoffeScriptのフィルタをJavaScriptのフィルタに変更したところ、本来の速度になったという話。
測定する
新しくRailsアプリを作って測定してみた。コードはgithubにプッシュした次のもの。
https://github.com/ttakuru88/filter-bench
単純にviewが次のようになっている2つのページを用意した。
coffee.html.haml
%h1 :coffee
:coffee
console.log('hi');
javascript.html.haml
%h1 :javascript
:javascript
console.log('hi');
この2つのページにそれぞれを20回ほどアクセスして平均を取ってみると次のようになった。
回数 | /coffee | /javascript |
---|---|---|
1 | 155.8 | 2.1 |
2 | 150.5 | 1.4 |
3 | 179.1 | 2.2 |
4 | 161 | 1.7 |
5 | 160.1 | 1.1 |
6 | 156.4 | 2.9 |
7 | 165.8 | 1.5 |
8 | 166.5 | 1.2 |
9 | 167.7 | 3.8 |
10 | 175.5 | 2 |
11 | 159.5 | 0.9 |
12 | 165.6 | 1.4 |
13 | 169.6 | 1.2 |
14 | 159.5 | 2.1 |
15 | 165.7 | 1.2 |
16 | 168.3 | 1.5 |
17 | 168.1 | 1.6 |
18 | 174.5 | 1.5 |
19 | 155.3 | 1.2 |
20 | 165.6 | 1.2 |
平均 | 164.505 | 1.685 |
coffeeフィルタを使うだけで100倍近く時間かかってる
というわけで、CoffeeScriptはあまり使わなくなってくるようだし、こんなフィルタは使わないようにしたい。