0

У меня, похоже, очень медленный метод в одной из моих моделей, и я узнал, как его исправить. Наряду с этим идет сравнение его эффективности, и я не думаю, что сейчас делаю это очень хорошо.Как измерить эффективность работы activerecord фона в рельсах?

Модель работает в фоновом режиме в sidekiq, обрабатывая текст привязки по ключевым словам, чтобы найти совпадения. Я использую драгоценный камень MethodProfiler вместе со временными метками, чтобы уменьшить медленность до моего метода get_top_match. Мой код выглядит следующим образом:

# This is the code I'm running in the background 
def spam_check 
    words.each do |word| 
    spam_keyword = SpamKeyword.top_match_for(word) 
    spam_keyword.spam_score 
    end 
end 

class SpamKeyword 

def self.top_match_for(anchor_text) 
    all_keywords_set.find do |keyword| 
     if Regexp.new(keyword.keyword) =~ anchor_text 
      if keyword.only_match_whole_words 
       if /#{keyword.keyword}\b/ =~ anchor_text || /#{keyword.keyword.pluralize}\b/ =~ anchor_text 
        return keyword 
       end 
      else 
       return keyword 
      end 
     end 
    end 
end 

def self.all_keywords_set 
    order(spam_score: :desc) 
end 

#The ways I've found to benchmark so far:` 

MethodProfiler results for: SpamKeyword 
+-------------------+------------+--------------+--------------+-----------------+-------------+ 
| Method   | Min Time | Max Time  | Average Time | Total Time  | Total Calls | 
+-------------------+------------+--------------+--------------+-----------------+-------------+ 
| .top_match_for | 100.142 ms | 11406.057 ms | 2854.346 ms | 19657882.947 ms | 6887  | 
| .all_keywords_set | 0.056 ms | 1318.212 ms | 1.762 ms  | 12159.412 ms | 6899  | 
+-------------------+------------+--------------+--------------+-----------------+-------------+ 

spam_check_time 1273.384929213 
    num_words_processed 222 
    secs_per_word 5.735968149608109 

Я хотел бы больше советов о том, как улучшить производительность, но я думаю, что это, вероятно, будет наиболее полезными вниз линия, и полезно для будущих читателей этого вопроса, является то, что это лучшие способы увидеть в трассировке стека и вызовы базы данных для фоновых методов, подобных этим?

ответ

1

думаю лучший инструмент здесь будет ruby-prof.

Он может отображать общее время, проведенное в каждом методе. Кроме того, он также покажет, какие методы вызывают текущий метод и какие методы его вызовы. Here is example output with comments.

0

В целом на сегодняшний день наиболее актуальным инструментом для измерения производительности является benchmark-ips, вы обязательно должны его использовать.