这两种形式的数组初始化在 Ruby 中哪种更好?
方法一:
DAYS_IN_A_WEEK = (0..6).to_a
HOURS_IN_A_DAY = (0..23).to_a
@data = Array.new(DAYS_IN_A_WEEK.size).map!{ Array.new(HOURS_IN_A_DAY.size) }
DAYS_IN_A_WEEK.each do |day|
HOURS_IN_A_DAY.each do |hour|
@data[day][hour] = 'something'
end
end
方法二:
DAYS_IN_A_WEEK = (0..6).to_a
HOURS_IN_A_DAY = (0..23).to_a
@data = {}
DAYS_IN_A_WEEK.each do |day|
HOURS_IN_A_DAY.each do |hour|
@data[day] ||= {}
@data[day][hour] = 'something'
end
end
第一种方法和第二种方法的区别是第二种方法一开始不分配内存。我觉得第二个在性能方面有点差,因为必须进行大量的数组复制。
但是,在 Ruby 中查找正在发生的事情并不是直截了当的。所以,如果有人能向我解释哪个更好,那就太好了!
谢谢
最佳答案
在我回答你问的问题之前,我要回答你应该问但没有问的问题:
Q: Should I focus on making my code readable first, or should I focus on performance first?
答:首先让你的代码可读并纠正,然后,只有出现性能问题时,才开始担心性能通过测量性能问题是首先并且仅然后更改您的代码。
现在回答你提出的问题,但不应该:
方法1.rb:
DAYS_IN_A_WEEK = (0..6).to_a
HOURS_IN_A_DAY = (0..23).to_a
10000.times do
@data = Array.new(DAYS_IN_A_WEEK.size).map!{ Array.new(HOURS_IN_A_DAY.size) }
DAYS_IN_A_WEEK.each do |day|
HOURS_IN_A_DAY.each do |hour|
@data[day][hour] = 'something'
end
end
end
方法2.rb:
DAYS_IN_A_WEEK = (0..6).to_a
HOURS_IN_A_DAY = (0..23).to_a
10000.times do
@data = {}
DAYS_IN_A_WEEK.each do |day|
HOURS_IN_A_DAY.each do |hour|
@data[day] ||= {}
@data[day][hour] = 'something'
end
end
end
脑死亡基准测试结果:
$ time ruby method1.rb
real 0m1.189s
user 0m1.140s
sys 0m0.000s
$ time ruby method2.rb
real 0m1.879s
user 0m1.780s
sys 0m0.020s
在我看来,用户时间使用(重要因素)使 method1.rb 快得多。当然,您不应该相信这个基准,应该让您自己的基准反射(reflect)您的实际代码使用。但是,只有确定哪些代码实际上是您的性能瓶颈后,您才应该这样做。 (提示:99.44% 的计算机程序员在没有测量的情况下猜测他们的瓶颈在哪里时是 100% 错误!)
关于ruby - 这些 Array Initializations 中的哪个在 Ruby 中更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3042912/