снижение стоимости Authlogic / находка в вызове ajax - PullRequest
1 голос
/ 23 августа 2010

Я заметил, что мои AJAX-вызовы на моем сайте медленные, и, глядя на NewRelic RPM Я заметил, что большая часть расходов приходится на Authlogic/find.

Полагаю, это потому, что rails должен искать пользователя каждый раз (даже при вызовах AJAX), но 147 микросекунд кажется ужасно медленным.

Category    Segment     % Time      Avg Calls (per Txn)     Avg Exclusive Time (ms)
Custom       Authlogic/find      77      1.0     147
Controller  LikesController#toggle  13  1.0     25
Database    SQL - SHOW  4.9     1.5     9.3
Database    SQL - OTHER     1.1     3.7     2.1
ActiveRecord    User#find   0.8     1.0     1.5
View    application.html.haml Template  0.7     0.2     1.3
View    _like.html.haml Template    0.5     0.8     0.89
ActiveRecord    ActiveRecord::SessionStore::Session#find    0.4     1.0     0.69 

Вот мой код:

class LikesController < ApplicationController
  ## commented this part out in the hopes of reducing authlogic needs, since it's simple for me to check for current_user myself.

  # access_control do
  #   allow :admin
  #   allow logged_in, :to => [:toggle]
  # end
  before_filter :check_if_admin, :except => [:toggle]

  def index
    @likes = Like.all
  end

  def toggle
    if !current_user
      render :nothing => true and return
    end

    like = Like.find(:first, :conditions => "user_id = #{current_user.id} and likable_id = #{params[:likable_id]} and likable_type = '#{params[:likable_type]}'")
    if like != nil
      like.destroy
      @current_user_likes_likable = false
    else
      like = Like.new(:likable_id => params[:likable_id], :likable_type => params[:likable_type], :user => current_user)
      like.save
      @current_user_likes_likable = true
    end
    @likable_id = params[:likable_id]
    @likable_type = params[:likable_type]
    #@likable = Kernel.const_get(params[:likable_type]).find(params[:likable_id])
    render "shared/like"
  end
...

Также вот где current_user определен в ApplicationController:

class ApplicationController < ActionController::Base
  helper :layout
  helper_method :current_user_session, :current_user, :current_user_is_admin

  private
    def current_user_session
      return @current_user_session if defined?(@current_user_session)
      @current_user_session = UserSession.find
    end
    def current_user
      return @current_user if defined?(@current_user)
      @current_user = current_user_session && current_user_session.record
    end

Ответы [ 2 ]

0 голосов
/ 03 января 2011

У меня такая же проблема в другом приложении.Я создал чистый проект с использованием authlogic: http://github.com/josei/authlogic_rpm

Newrelic установлен и работает, так что вы можете быстро проверить производительность authlogic.Как видите, производительность вполне нормальная (около 50 мс с sqlite3), поэтому накладные расходы должны быть где-то еще (возможно, плагином).

0 голосов
/ 23 августа 2010

Какую базу данных вы используете?Если у вас медленные запросы, первое, на что нужно обратить внимание - это индексы в вашей базе данных .Я не знаю, какой SQL работает метод find, но это хорошее место для начала.Убедитесь, что у вас есть правильные индексы (может потребоваться более одного) для столбцов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...