Производительность массивов и хэшей в Ruby

У меня есть программа, которая будет хранить много экземпляров одного класса, скажем, до 10.000 или больше. У экземпляров класса есть несколько свойств, которые мне нужны время от времени, но наиболее важным из них является идентификатор.

class Document
  attr_accessor :id
  def ==(document)
    document.id == self.id
  end
end

Теперь, каков самый быстрый способ сохранить тысячи этих объектов?

Я помещал их все в массив документов:

documents = Array.new
documents << Document.new
# etc

Теперь альтернативой было бы хранить их в хэше:

documents = Hash.new
doc = Document.new
documents[doc.id] = doc
# etc

В моем приложении я в основном нужно выяснить, существует ли вообще документ. Является ли функция has_key хэша ? значительно быстрее, чем линейный поиск в массиве и сравнение объектов документа ? Оба находятся в пределах O (n) или has_key? даже O (1) . Увижу ли я разницу?

Кроме того, иногда мне нужно добавить документы, когда они уже существуют. Когда я использую массив, я должен был бы проверить с include? раньше, когда я использую хеш, я бы просто снова использовал has_key? . Тот же вопрос, что и выше.

Что вы думаете? Каков самый быстрый метод хранения больших объемов данных, когда в 90% случаев мне нужно только знать, существует ли идентификатор (а не сам объект!)

38
задан slhck 5 April 2011 в 11:36
поделиться