我需要分析ruby gems的内存使用情况。 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
足迹?
是否有任何更清洁的方法来测量MRI上的宝石记忆足迹〜> 1.9.2?
有关改进我的代码的任何提示吗?
答案 0 :(得分: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在irb
$ cd my_padrino_project
$ irb -r /path/to/my/lib.rb
>> require_relative 'config/boot'
并检查结果。
答案 1 :(得分:0)
对于Windows开发者:看一下https://github.com/ruby-prof/ruby-prof gem。