#pgid
Vitamin Features >> 5 Ways to Optimize AJAX in Ruby on Rails
http://www.thinkvitamin.com/features/ajax/5-ways-to-optimize-ajax-in-ruby-on-rails
の部分的超訳メモ :p
- Ruby on Rails/Ajaxアプリの5つの最適化。
++ データベースのインデックスの最適化
++ 冗長なSQLクエリを除く
++ レスポンスの圧縮、極小化
++ フラグメントキャッシュ
++ レンダリング前のクライアントサイドのJavaScriptキャッシュ
** データベースのインデックスの最適化 [#pce7bfcb]
- [[QueryTrace plugin:http://blog.talbott.ws/articles/2006/05/17/querytrace-my-first-official-rails-plugin]]をインストールすると、次のようなログがlog/development.logに残る。
Conversation Load (0.001538) SELECT * FROM conversations WHERE (conversations.id = 23453) LIMIT 1
app/models/feed_observer.rb:14:in `after_create'
app/controllers/conversation_controller.rb:162:in `send_to'
script/server:3
- [[railsbench:http://railsbench.rubyforge.org/]]とか[[Ruby Performance Validator:http://www.softwareverify.com/rubyPerformanceValidator/index.html]]を使えば、ボトルネックがわかる。
** 冗長なSQLクエリを除く [#lf166e85]
- 一回DBから取得したものは再利用しよう
class ApplicationController < ActionController::Base
protected
def current_member
@current_member ||= Member.find(session[:member_id])
end
helper_method :current_member
end
end
** レスポンスの圧縮、極小化 [#zd4b8818]
- gzip圧縮のapache module
-- [[mod_deflate (apache 2.2):http://httpd.apache.org/docs/2.2/mod/mod_deflate.html]]
-- [[thread on config’ing lighty with gzip:http://forum.lighttpd.net/topic/7729]]
-- [[apache 2.2 + mod_deflate tutorial:http://losingmyjob.wordpress.com/2007/05/04/apache-22-mongrel-cluster/]].
- (要約すると、tagを描画する際、HTMLの動的に変わる部分だけをレスポンスで返し、JavaScript側で、静的なHTML部分を正規表現などで置換して補ってやれば、通信コストが減るよ、ということか)
** フラグメントキャッシュ [#u6acc583]
- (自前??? なんでRailsのキャッシュンの機構を使わないのかよくわからない...)
** レンダリング前のクライアントサイドのJavaScriptキャッシュ [#faea3afc]
- Ajaxで受け取った結果をhidden等に入れておいて、それを再利用するアイディアらしい。
loadConversation: function(id) {
if ($('pre-' + id).innerHTML != '') {
var decoded = decode($('pre-' + id).innerHTML);
eval(decoded);
} else {
new Ajax.Request('/mailroom/conversation/' + id,
{asynchronous:true,
evalScripts:true,
onComplete: cacheConversation});
}
}
cacheConversation = function(originalRequest) {
var hidden_div_id = 'pre-' + conv_id;
$(hidden_div_id).innerHTML = encode(originalRequest.responseText);
}
#blikifooter(志田)
tags [[Ajax>tag/Ajax]], [[Ruby on Rails>tag/Ruby on Rails]]