我试图决定是否在我的代码中实现PStore
,而不是将各种对象另存为Marshal
。以下代码试图比较两种方法的性能:
require 'pstore'
def m_dump(filename, object)
File.open(filename,"wb") do |f|
Marshal.dump(object, f)
end
end
def m_load(filename)
object = nil
File.open(filename,'rb') do |f|
object = Marshal.load(f)
end
return object
end
test = {}
test[:pi] = [Math::PI]*100000000
start = Time.now
m_dump("test.marshal", test);nil
puts "Marshal File written in #{(Time.now - start).to_s}"
start = Time.now
results = PStore.new("test.pstore")
results.transaction{results[:test] = test};nil
puts "Pstore File written in #{(Time.now - start).to_s}"
start = Time.now
test2 = m_load("test.marshal");nil
puts "Marshal File read in #{(Time.now - start).to_s}"
start = Time.now
results2 = PStore.new("test.pstore")
test3 = results2.transaction{results2[:test]};nil
puts "Pstore read in #{(Time.now - start).to_s}"
puts "Marshal check #{test2 == test}"
puts "Pstore check #{test3 == test}"
运行代码将产生以下结果:
Marshal File written in 7.936485
Pstore File written in 5.526494
Marshal File read in 5.890848
Pstore read in 11.135965
[似乎在创建新档案时PStore
稍微快一些,但是在必须读取数据时要慢得多。
考虑到PStore
始终基于Marshal
,所以我希望有类似的性能。这是预期的行为吗?
交易=>交易(true)其中“ true”表示只读。然后,性能将与marshall相似。
start = Time.now
results2 = PStore.new("test.pstore")
test3 = results2.transaction(true) {results2[:test]}; nil
puts "Pstore read in #{(Time.now - start).to_s}"