ruby - 这些 Array Initializations 中的哪个在 Ruby 中更好?

标签 ruby performance arrays memory initialization

这两种形式的数组初始化在 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/

相关文章:

mysql - 我应该如何编写取决于参数键的案例语句?

Ruby 多线程/多处理读物

ruby-on-rails - 如何在rails 7中使用format js?

javascript - 将java脚本数组元素作为输入字段值放入html表单中?

javascript - rails 5 : JS treeview from hash of dates

sql - 关于学习如何在 SQL Server 2005 中解释 SQL 查询的执行计划的任何指南?

python - Numpy 距阵列中心的平均距离

用于数组的 Java 函数,如 PHP 的 join()?

javascript - 将 "1"添加到数组的开头和结尾

java - "||"和循环哪个更有效?