Размер класса в байтах

есть ли способ увидеть размер выделенной памяти для класса в ruby?

Я построил пользовательский класс, и я хотел бы знать его размер в памяти. Так есть функция с подобием sizeof() в C?

Я просто пытаюсь инициализировать новый класс, Как так

test = MyClass.new

и пытается найти метод для распечатки размера класса, который был выделен в память.

возможно ли это в ruby?

1 ответов


нет языковой функции, которая вычисляет размер класса так же, как C.

размер памяти объекта зависит от реализации. Это зависит от реализации объекта базового класса. Также не просто оценить используемую память. Например, строки могут быть встроены в структуру RString, если они короткие, но хранятся в куче, если они длинные (не создайте строки Руби длиннее 23 символов).

в память, занятая некоторыми объектами, была табулирована для различных реализаций ruby:объем памяти объектов в Ruby 1.8, EE, 1.9 и OCaml

и, наконец, размер объекта может отличаться даже с двумя объектами из одного класса, так как можно произвольно добавлять дополнительные переменные экземпляра, без хардкодить какие переменные присутствуют. Например, см. instance_variable_get и instance_variable_set


Если вы используете MRI ruby 1.9.2+, есть метод, который вы можете попробовать (имейте в виду, что он смотрит только на часть объекта, это очевидно из того, что целые числа и строки имеют нулевой размер):

irb(main):176:0> require 'objspace'
=> true
irb(main):176:0> ObjectSpace.memsize_of(134)
=> 0
irb(main):177:0> ObjectSpace.memsize_of("asdf")
=> 0
irb(main):178:0> ObjectSpace.memsize_of({a: 4})
=> 184
irb(main):179:0> ObjectSpace.memsize_of({a: 4, b: 5})
=> 232
irb(main):180:0> ObjectSpace.memsize_of(/a/.match("a"))
=> 80

вы также можете попробовать memsize_of_all (обратите внимание, что он смотрит на использование памяти всего интерпретатора, а перезапись переменной не удаляет старую копию сразу же):

irb(main):190:0> ObjectSpace.memsize_of_all
=> 4190347
irb(main):191:0> asdf = 4
=> 4
irb(main):192:0> ObjectSpace.memsize_of_all
=> 4201350
irb(main):193:0> asdf = 4
=> 4
irb(main):194:0> ObjectSpace.memsize_of_all
=> 4212353
irb(main):195:0> asdf = 4.5
=> 4.5
irb(main):196:0> ObjectSpace.memsize_of_all
=> 4223596
irb(main):197:0> asdf = "a"
=> "a"
irb(main):198:0> ObjectSpace.memsize_of_all
=> 4234879

вы должны быть очень осторожны, потому что нет никакой гарантии, когда интерпретатор Ruby будет выполнять сбор мусора. Хотя вы можете использовать это для тестирования и экспериментов, рекомендуется не использовать это в производстве!