Я пытаюсь отобразить большой (ish) массив объектов в виде списка в Ruby on Rails. Коллекция в настоящее время содержит до 200 объектов, каждый из которых по сути является записью (словарь ключей / значений). Общий формат результата представляет собой plist (используемый Apple), но логически он не сильно отличается от любого XML-документа.
Проблема, с которой я столкнулся, состоит в том, что рендеринг массива занимает около 200 секунд с 200 объектами, что мне кажется невероятно медленным. В настоящее время я использую код, подобный этому:
def plistify(collection)
resultarray=Array.new()
collection.each do |entry|
hash= entry.attributes
hash["credits"]= entry.credits
hash["ratingcount"]= entry.ratings.count
hash["entryrating"]= entry.detail_rating
hash["entryratingcount"]= entry.entryratingcount
resultarray << hash
end
{'entries'=>resultarray}.to_plist
end
Который затем отправляется клиенту, используя:
format.text {render :text => plistify(@entries)}
Полученный результат выглядит примерно так:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>entries</key>
<array> <-- corresponds to resultarray above
<dict> <-- corresponds to a single entry's attributes above. one of these per entry.
<key>cached_review_id</key>
<integer>190</integer>
<key>cached_tag_list</key>
<string>pub restaurant food waitress</string>
<key>created_at</key>
<date>2009-05-31T13:47:10Z</date>
...about 20 key/values...
и т.д.. Почти все служебные данные находятся в коде ruby 'plistify' - по сравнению с ним служебные данные базы данных минимальны.
Предполагая, что издержки могут быть связаны с созданием большого количества временных объектов ruby, я попытался заменить все это на представление и использовать Builder в представлении для создания того же XML-документа - это работает, но на самом деле в два раза медленнее!
Есть идеи, как улучшить это или иным образом выявить узкое место?