Как я могу найти узкие места производительности в моем приложении Ruby? - PullRequest
5 голосов
/ 26 января 2009

Я написал приложение на Ruby, которое анализирует множество данных из источников в различных форматах HTML, XML и CSV-файлов. Как я могу узнать, какие области кода занимают больше всего времени?

Есть ли хорошие ресурсы о том, как улучшить производительность приложений на Ruby? Или у вас есть какие-то стандарты кодирования производительности, которым вы всегда следуете?

Например, вы всегда присоединяете свою строку с

output = String.new
output << part_one
output << part_two
output << '\n'

или вы бы использовали

output = "#{part_one}#{part_two}\n"

Ответы [ 5 ]

10 голосов
/ 26 января 2009

Ну, есть некоторые хорошо известные практики, такие как конкатенация строк намного медленнее, чем "# {value}", но чтобы выяснить, где ваш скрипт потребляет большую часть своего времени или больше, чем требуется, вам нужно выполнить профилирование , Существует рубиновый камень под названием ruby-prof. Профилировщик может обратить ваше внимание даже на те проблемы с производительностью, которые могут возникать редко. Я использовал это много и считаю это очень полезным. Вот некоторая информация об этом непосредственно с официального сайта

ruby-prof - быстрый профилировщик кода для Рубин. Его функции включают в себя:

Скорость - это расширение C и поэтому во много раз быстрее, чем стандартный Ruby профилировщик.

Режимы - Ruby prof может измерять ряд различных параметров, в том числе время вызовов, использование памяти и распределение объектов.

Отчеты - может генерировать текстовые и перекрестные html отчеты

Плоские профили - аналогично отчетам, генерируемым стандартным Ruby Profiler

Профили графика - аналогично GProf, они показывают, как долго работает метод, какие методы вызывают это и какие методы это вызывает.

Профили дерева вызовов - вывод результатов в формате дерева вызовов подходит для профилирования KCacheGrind инструмент.

Threads - поддерживает профилирование нескольких потоков одновременно

Рекурсивные вызовы - поддерживает профилирование рекурсивных вызовов методов

3 голосов
/ 26 января 2009

Вы можете проверить производительность отдельных участков кода с помощью стандартного модуля Benchmark .

Вы также можете протестировать свой код в различных реализациях Ruby (например, 1.9, Rubinius) и посмотреть, ускоряет ли это процесс.

Конечно, если ваши проблемы имеют алгоритмический характер, не стоит слишком много беспокоиться о таких вещах, как скорость конкатенации строк ...

3 голосов
/ 26 января 2009
1 голос
/ 27 января 2009

Кроме того, что написано выше, я также рекомендую посмотреть скринкаст Scaling Ruby . В нем есть несколько интересных советов и рекомендаций по написанию более быстрого кода на Ruby.

0 голосов
/ 26 января 2009

Существует также набор инструментов dTrace для Ruby, которые вы можете использовать в dTraceToolkit

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