что произойдет, если я сохраню коллекцию данных в переменной экземпляра в методе initialize? - PullRequest
0 голосов
/ 29 декабря 2018

что произойдет, если я сохраню коллекцию данных в переменной экземпляра по методу инициализации?

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

Любая помощь будет оценена.

Ответы [ 2 ]

0 голосов
/ 01 января 2019

Я хочу понять, как это замедляет выполнение.

Если вы спрашиваете, может ли выполнение чего-либо в initialize замедлить выполнение, тогда да.Когда вы вызываете метод new, код внутри этого блока будет работать и не вернется, пока не будет завершен.

Например, следующий код должен показать, как код в initialize замедлит выполнение кода.

class Foo 
    def initialize(n)
        sleep n 
    end
end

puts "slow down with sleep"
puts Time.now 
Foo.new(0)
puts Time.now 
Foo.new(1)
puts Time.now 

class Bar 
    def initialize(n)
        @a = []
        (0..n).each { |i| @a<<i } 
    end
end

puts "slow down with work"
puts Time.now 
Bar.new(0)
puts Time.now 
Bar.new(100000000)
puts Time.now 
0 голосов
/ 30 декабря 2018

Это зависит от того, сделаете ли вы новую копию данных перед ее передачей для инициализации.Для данного класса:

class MyClass
  attr_accessor :big_list
  def initialize(big_list)
    @big_list = big_list
  end
end

big_list = (0..1_000_000).to_a

big_list будет храниться в памяти только один раз:

inst = MyClass.new(big_list)

Поскольку переменная экземпляра в классе и исходная переменная big_listэто один и тот же объект, изменение одного меняет оба:

inst.big_list.clear
puts big_list.length # => 0

Это другая история, если вы полностью переназначаете одну из переменных, потому что тогда они указывают на разные объекты (и будет использоваться дополнительная память))

inst.big_list = [1,2,3]
puts big_list.length # => 0

То же самое произойдет, если вы передадите другой список для инициализации:

inst = MyClass.new(big_list + big_list)
puts inst.big_list.length == big_list.length # => false

В этом случае в памяти будут храниться два списка, а не один.

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