Низкопрофильное профилирование Ruby? - PullRequest
2 голосов
/ 28 сентября 2010

У меня есть программа на Ruby, выполнение задачи которой занимает около 4 минут, и я хотел бы сократить ее до 1 минуты.

Я пробовал ruby-prof из gem, но его включение увеличивает время выполнения до~ 30 минут, и, кажется, даже не особенно хорошо сохраняет монотонность (некоторые изменения достоверно улучшают производительность с профилировщиком и, как надежно, ухудшают производительность без профилировщика).Эта задача также не может быть разбита на части, которые можно осмысленно профилировать независимо.

Каков наилучший на сегодняшний день способ профилирования кода Ruby с наименьшими издержками?

Я использую OSX, но если для какой-либоПо причине того, что для профилировщика требуется другая ОС, я мог бы перезагрузиться.

РЕДАКТИРОВАТЬ: perftools.rb имеет гораздо меньшие накладные расходы, но если честно, результаты выглядят довольно сомнительными, выходящими за пределы любой разумной ошибки выборки - по крайней мере, это должно быть сбойс GC или буферизацией ввода-вывода или чем-то в этом роде, что вызывает много глупых недоразумений.Он по-прежнему превосходит ruby-prof.

Я оставлю вопрос открытым, если кто-нибудь знает что-то лучше этого.

Ответы [ 2 ]

6 голосов
/ 28 сентября 2010

Я не думаю, что вы можете добиться большего успеха с помощью MRI или YARV.

Однако у Рубиниуса есть встроенный профилировщик (просто вызов с -Xprofile) с гораздо меньшими накладными расходами.

А с JRuby вы получаете весь массив инструментов Java, который включает в себя одни из лучших когда-либо созданных профилировщиков.Даже без специальной поддержки JRuby эти инструменты могут быть весьма полезны.Oracle JDK имеет этот чрезвычайно крутой VisualVM инструмент, который позволяет вам визуализировать все виды информации о вашей программе (и AFAIK есть даже плагин для JRuby).Oracle JRockit также имеет отличный профилировщик.По слухам, у Azul JVM есть совершенно потрясающий профилировщик.Я думаю, что у J9 тоже отличный.И, конечно же, есть YourKit .

Чарльз Оливер Наттер и другие члены сообщества JRuby недавно написали серию статей о понимании поведения Ruby-кода во время выполнения с использованием JRuby.В основном эти статьи были написаны как реакция на библиотеку memprof для MRI , и поэтому они, как правило, фокусируются на профилировании памяти, но там также есть кое-что о профилировании вызовов.

AFAIKодна из целей MacRuby состояла в том, чтобы использовать Ruby для понимания среды исполнения XCode (Instruments and Co.), но это скорее долгосрочная цель, я не знаю, реализовано ли это в настоящее время.

Вот небольшой пример от Рубиниуса:

rbx -Xprofile -e'
  Hash.new {|fibs, n|
    fibs[n] = if n < 2 then n else fibs[n-1] + fibs[n-2] end
  }[100]
'

Что печатает:

Total running time: 0.009895000000000001s

  %   cumulative   self                self     total
 time   seconds   seconds      calls  ms/call  ms/call  name
------------------------------------------------------------
   7.59    0.00      0.00        234     0.00     0.01  Hash#find_entry
   5.86    0.00      0.00        419     0.00     0.00  Hash#key_index
   5.49    0.00      0.00        275     0.00     0.00  Hash::Entry#match?
   4.97    0.01      0.00        234     0.00     0.02  Hash#[]

Как вы можете видеть, одним интересным свойством профилировщика Рубиниуса является то, что он может профилироватьпроизвольный код Ruby, а сам Rubinius является в основном кодом Ruby, он может профилировать глубоко в самой системе.

2 голосов
/ 28 сентября 2010

Любой профилировщик, который дает вам время, сообщает на уровне функций, считает, что точность и эффективность важны, и предоставляет вам график вызовов, основан на том же наборе понятий, что и в оригинальном gprof с небольшими вариациями. ruby_prof - только один из многочисленных примеров.

Вот почему это не хорошо.

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

Вот пример использования его для получения большого ускорения.

...