2012-02-25 4 views
1

Мне нужно профилировать использование памяти рубиновых драгоценных камней. https://stackoverflow.com/a/164206/391229 предлагает использовать системный вызов для измерения объема памяти, поэтому в итоге появился метод наложения псевдонимов require и сбор статистики.Профилирование использования рубиновой памяти по требованию звонка

В верхней части сценария запуска (в моем случае это /usr/bin/padrino):

$memstat = {} 
$memusage = `pmap #{Process.pid} | tail -1`[10,40].strip.to_i 
$memstat['base'] = $memusage 

alias :old_require :require 
def require *args 
    result = old_require *args 
    oldmem = $memusage 
    $memusage = `pmap #{Process.pid} | tail -1`[10,40].strip.to_i 
    delta = $memusage - oldmem 
    $memstat[args[0]] ||= 0 
    $memstat[args[0]] += delta 
    result 
end 

События после загрузки все (Padrino.after_load):

stat = $memstat.select{ |k,v| v>0 }.to_a.sort{ |a,b| a[1]<=>b[1] } 
summ = 0 
stat.each do |row| 
    summ += row[1] 
    puts "#{row[1].to_s.rjust(7)} KB: #{row[0]}" 
end 
puts summ.to_s.rjust(7) + ' KB' 

Выхода я получаю на вызов padrino console является:

 ... 
    2120 KB: redcarpet.so 
    2184 KB: socket.so 
    2220 KB: etc 
    2332 KB: addressable/idna/pure 
    2740 KB: strscan 
    2992 KB: haml/buffer 
    3508 KB: pathname 
    4240 KB: psych.so 
    4252 KB: digest.so 
    6028 KB: /home/ujif/swift/admin/app.rb 
    6292 KB: zlib 
    6704 KB: readline 
    9116 KB: openssl.so 
    12408 KB: do_mysql/do_mysql 
    28164 KB: base 
145648 KB 

Вопросы:

Есть ли способ копать в base отпечаток?

Есть ли какой-либо более чистый подход для измерения объема памяти драгоценных камней на МРТ ~> 1.9.2?

Любые подсказки по улучшению моего кода?

ответ

2

Да, это рубиновый стек. Попробуйте

$ irb 
>> `pmap #{Process.pid} | tail -1` 

У вас такой же результат.

Шахта: 144512K

Вместо если вы запустите:

$ ruby -e 'system "pmap #{Process.pid} | tail -1"' 

вас на меньшее значение: 27788K (шахта)

Так, чтобы проверить лучше, что же случилось вернуться к IRB

$ irb 
>> puts `pmap #{Process.pid}` 

Когда вам нужно отследить padrino deps загрузить вашу lib внутри irb

$ cd my_padrino_project 
$ irb -r /path/to/my/lib.rb 
>> require_relative 'config/boot' 

и проверьте ваши результаты.

 Смежные вопросы

  • Нет связанных вопросов^_^