У меня, похоже, очень медленный метод в одной из моих моделей, и я узнал, как его исправить. Наряду с этим идет сравнение его эффективности, и я не думаю, что сейчас делаю это очень хорошо.Как измерить эффективность работы 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
Я хотел бы больше советов о том, как улучшить производительность, но я думаю, что это, вероятно, будет наиболее полезными вниз линия, и полезно для будущих читателей этого вопроса, является то, что это лучшие способы увидеть в трассировке стека и вызовы базы данных для фоновых методов, подобных этим?