我目前正在开发 HTML5 手机游戏的后端。我们使用 JSONP 与应用程序通信(因为跨域策略)。
但是 Heroku 上的托管真的很慢,我们的平均响应时间为 900 毫秒。我已经在使用包含来加速数据库访问和生产数据库。我也在运行新的遗物来分析服务器。
大部分时间都用在 Controller 本身。Controller方法中需要800ms中的650ms。
Category Segment % Time Avg calls
(per txn) Avg
time (ms)
Controller TasksController#update 63.4 1.0 650
没错,控制器正在做很多事情,但有没有可能,一些 ruby 代码会花费这么多时间?或者可能是 jsonp 返回的东西?
Newrelic 告诉我,我们的用户最多等待 5 秒才能得到响应。这真的很多!
我们的 ApplicationController 如下所示:
# encoding: utf-8
class ApplicationController < ActionController::Base
protect_from_forgery
include ApplicationHelper
include ProfilesHelper
before_filter :authenticate, :set_locale
after_filter :check_for_kpi
def check_for_kpi
if (params[:kpi])
case params[:kpi]
when Hash
params[:kpi].each do |k, v|
#all done in delayed jobs
Kpi.delay.add(k, :value => v)
end
when String
Kpi.delay.add(params[:kpi])
when Array
params[:kpi].each do |k|
Kpi.delay.add(k)
end
else
logger.warn("Parameters for Kpi not detected. #{params[:kpi]} ")
end
end
rescue
logger.warn("Something went wrong in the check for kpis. ")
end
def set_locale
I18n.locale = params[:locale] || I18n.default_locale
end
def authenticate
authkey = params[:session_key]
@error = {}
@profile = Profile.includes(#some more includes).find_by_authkey(authkey)
if (@profile.nil?)
render_json(
{
:authentication_error => true
}
)
else
if (params[:version]!= @profile.version)
@profile.delay.update_attributes(:version => params[:version])
end
end
end
protected
def render_json(json, profile = nil)
profile ||= @profile
respond_to do |format|
format.js {
render :js => build_result_string(json, profile, params[:controller], params[:callback])
}
format.json {
render :json => json.merge(profile.try(:getSessionData))
}
end
end
end
您对如何提高性能有任何想法吗?
谢谢!