require 'benchmark'
require 'ostruct'
REP = 100000
User = Struct.new(:name, :age)
USER = "User".freeze
AGE = 21
HASH = {:name => USER, :age => AGE}.freeze
Benchmark.bm 20 do |x|
x.report 'OpenStruct slow' do
REP.times do |index|
OpenStruct.new(:name => "User", :age => 21)
end
end
x.report 'OpenStruct fast' do
REP.times do |index|
OpenStruct.new(HASH)
end
end
x.report 'Struct slow' do
REP.times do |index|
User.new("User", 21)
end
end
x.report 'Struct fast' do
REP.times do |index|
User.new(USER, AGE)
end
end
end
对于那些不耐烦的人来说,他们想了解基准测试结果,而不需要自己运行它们,这里是上面代码的输出(在MB Pro 2.4GHz i7上)
user system total real
OpenStruct slow 4.430000 0.250000 4.680000 ( 4.683851)
OpenStruct fast 4.380000 0.270000 4.650000 ( 4.649809)
Struct slow 0.090000 0.000000 0.090000 ( 0.094136)
Struct fast 0.080000 0.000000 0.080000 ( 0.078940)
9条答案
按热度按时间g52tjvyc1#
使用
OpenStruct
,您可以任意创建属性。另一方面,Struct
必须在创建时定义其属性。选择哪一个主要取决于您是否需要在以后添加属性。考虑它们的方法是将其作为一方的哈希和另一方的类之间的中间地带。与
Hash
相比,它们暗示了数据之间更具体的关系,但它们没有类那样的示例方法。例如,一个函数的一堆选项在散列中是有意义的;他们只是松散的联系。函数所需的姓名、电子邮件和电话号码可以打包在Struct
或OpenStruct
中。如果姓名、电子邮件和电话号码需要方法以“First Last”和“Last,First”格式提供姓名,那么您应该创建一个类来处理它。oxalkeyp2#
其他基准:
对于那些不耐烦的人来说,他们想了解基准测试结果,而不需要自己运行它们,这里是上面代码的输出(在MB Pro 2.4GHz i7上)
k5hmc34c3#
更新:
创建100万示例的计时:
请参阅:Ruby 3.0.0 Bug #18032被关闭,因为它是一个功能,而不是一个错误
报价:
旧答案:
从Ruby 2.4.1开始,OpenStruct和Struct在速度上更加接近。参见https://stackoverflow.com/a/43987844/128421
完整性:结构与类与Hashvs.OpenStruct
在Ruby 1.9.2上运行与burtlo类似的代码(1/4核x86_64,8 GB RAM)[编辑表以对齐列]:
OpenStructs是缓慢和内存密集型,不适合大型数据集
下面是重现结果的脚本:
ou6hu8tu4#
两者的使用情况完全不同。
你可以把Ruby 1.9中的Struct类看作是C中
struct
声明的等价物。在Ruby中,Struct.new
接受一组字段名作为参数,并返回一个新的Class。类似地,在C中,struct
声明接受一组字段,并允许程序员像使用任何内置类型一样使用新的复杂类型。鲁比:
C:
OpenStruct类可以比作C中的匿名结构声明。它允许程序员创建复杂类型的 * 示例 *。
鲁比:
C:
以下是一些常见的用例。
OpenStructs可用于轻松地将哈希转换为响应所有哈希键的一次性对象。
结构对于速记类定义很有用。
vfh0ocws5#
OpenStructs使用的内存要多得多,而且与Structs相比执行速度较慢。
在我的系统上,下面的代码在14秒内执行,消耗了1.5 GB的内存。您的里程可能会有所不同:
这几乎是瞬间完成的,消耗了26.6 MB的内存。
8fq7wneg6#
Struct
:OpenStruct
:h79rfbju7#
看一下关于新方法的API。很多差异可以在那里找到。
就我个人而言,我非常喜欢OpenStruct,因为我不必事先定义对象的结构,只需添加我想要的东西。我想这是它的主要优点(缺点)吧?
2guxujil8#
使用@Robert代码,我将Hashie::Mash添加到基准测试项中,并得到以下结果:
dgiusagp9#
OpenStruct
时,操作都会清除方法缓存,这意味着应用程序的执行速度会变慢。OpenStruct
的慢不慢不仅仅是它本身是如何工作的,而是使用它们给整个应用程序带来的影响:https://github.com/charliesome/charlie.bz/blob/master/posts/things-that-clear-rubys-method-cache.md#openstructs