Ruby 1,9 медленнее, чем Ruby 1,8? - PullRequest
       0

Ruby 1,9 медленнее, чем Ruby 1,8?

5 голосов
/ 22 октября 2010

У меня есть приложение Rails 2.3.8 с действием, которое извлекает большой объем данных из базы данных и обрабатывает его с 300-600 частями (рекурсивно отображая древовидную структуру). Сравнительный анализ одного запроса дает мне время ответа около 7 секунд.

Я думал, что обновление моей версии Ruby до версии 1.9 с версии 1.8 даст мне прирост производительности, но когда я тестирую версию 1.9, время отклика составляет около 9 секунд (на 2 секунды медленнее, чем на 1.8). Это было довольно удивительно для меня.

Какие факторы приведут к тому, что Ruby 1.9 будет работать медленнее, чем Ruby 1.8?

Ниже приведена часть файла журнала.

Рубин 1,8

Rendered family_index/descendants/_fi_hover (0.5ms)
Rendered family_index/descendants/_descendant (4.6ms)
Rendered search/_search_div (0.1ms)
Rendered family_index/descendants/_fi_hover (0.7ms)
Rendered family_index/descendants/_descendant (4.7ms)
Rendered search/_search_div (0.1ms)
Rendered family_index/descendants/_fi_hover (0.5ms)
Rendered family_index/descendants/_descendant (4.5ms)
Rendered family_index/descendants/_fi_hover (0.5ms)
Rendered family_index/descendants/_descendant (37.9ms)
Rendered family_index/surname_groups/_pedigree (3162.9ms)
Rendered shared/_headers (4.6ms)
Rendered shared/_new_messages (0.6ms)
Rendered shared/_home_logo (1.1ms)
Rendered shared/_login_box (4.0ms)
Rendered shared/_navigation (13.6ms)
Rendered shared/_flash_messages (0.8ms)
Rendered shared/_footer (1.0ms)
Rendered shared/_analytics (0.8ms)
Completed in 4552ms (View: 3352, DB: 147) | 200 OK [http://localhost/family_index/surname_groups/31]

Рубин 1,9

Rendered family_index/descendants/_fi_hover (0.3ms)
Rendered family_index/descendants/_descendant (1.9ms)
Rendered search/_search_div (0.1ms)
Rendered family_index/descendants/_fi_hover (0.4ms)
Rendered family_index/descendants/_descendant (2.0ms)
Rendered search/_search_div (0.1ms)
Rendered family_index/descendants/_fi_hover (0.3ms)
Rendered family_index/descendants/_descendant (1.9ms)
Rendered family_index/descendants/_fi_hover (0.3ms)
Rendered family_index/descendants/_descendant (15.1ms)
Rendered family_index/surname_groups/_pedigree (762.8ms)
Rendered shared/_headers (2.6ms)
Rendered shared/_new_messages (0.7ms)
Rendered shared/_home_logo (0.9ms)
Rendered shared/_login_box (3.6ms)
Rendered shared/_navigation (7.3ms)
Rendered shared/_flash_messages (0.7ms)
Rendered shared/_footer (0.8ms)
Rendered shared/_analytics (0.6ms)
Completed in 5736ms (View: 942, DB: 128) | 200 OK [http://localhost/family_index/surname_groups/31]

Похоже, что Ruby 1.9 рендерит представления и обрабатывает базу данных быстрее, но все еще выполняет запрос медленнее.

Ruby 1.8:

Completed in 4552ms (View: 3352, DB: 147) | 200 OK [http://localhost/family_index/surname_groups/31]

Рубин 1.9:

Completed in 5736ms (View: 942, DB: 128) | 200 OK [http://localhost/family_index/surname_groups/31]

Обновление 10-26-2010

Я нашел узкое место в моем коде. Это происходит из строки, которая загружает тонну элементов ActiveRecord, используя лениво загруженные ассоциации. Время БД невелико, но я предполагаю, что все распределение объектов требует значительных затрат. Вот моя ассоциация:

has_many  :deep_branches,
            :class_name => "FamilyIndex::Branch",
            :include => {
              :descendant => [:state, :county, {:wives => {:marriage => [:state,:county,:reference] }}, :reference, {
                :children => [:state, :county, {:wives => {:marriage => [:state,:county,:reference] }}, :reference, {
                  :children => [:state, :county, {:wives => {:marriage => [:state,:county,:reference] }}, :reference, {
                    :children => [:state, :county, {:wives => {:marriage => [:state,:county,:reference] }}, :reference] # add marriages to this data
                  }]
                }]
              }]
            }

Без активной загрузки полное действие занимает около 40 секунд, поэтому использование: include дает увеличение производительности примерно в 10 раз. Все еще ищу способ ускорить это. Возможно, кеширование - единственный путь отсюда.

Ответы [ 2 ]

7 голосов
/ 22 октября 2010

Обработка строк - это область, где 1,9 может быть медленнее, чем 1,8.

Так как 1.9 имеет надлежащую индексацию поддержки Юникода или разделение строки в кодировке Юникода может занять значительно больше времени, чем в 1.8, потому что в 1.8 string[i] просто вернет i-й байт, а в 1.9 он должен пройти строка для поиска i-го символа.

Если вы выполняете много операций со строками и не нуждаетесь в надлежащей поддержке юникода, вы можете просто установить кодировку ASCII или, возможно, двоичную, что должно значительно ускорить обработку строк.

2 голосов
/ 27 октября 2010

Таким образом, областью моего запроса, которая занимала больше всего времени, была огромная загрузка данных из-за отложенной загрузки ActiveRecord (см. Ассоциацию, указанную в вопросе). Я недостаточно знаком с внутренностями ActiveRecord 2.3.8, поэтому в конечном итоге я не уверен в том, что вызвало «медлительность».

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

Это значительно улучшило производительность, сократив время запроса до 1-1,5 секунды. Улучшение приносит пользу приложению, работающему как в 1.8, так и в 1.9, и теперь мое приложение работает немного быстрее в 1.9.

Спасибо всем за помощь!

...