【问题标题】:Which is faster: calculation or assignment哪个更快:计算或分配
【发布时间】:2017-03-17 11:52:49
【问题描述】:

我正在优化一些代码。我需要a+b+cx+y+z 的总和,我将计算这些变量的最小值和最大值。使用minmax 不是一种选择。我将分别进行这些计算。

以下哪个代码块更快?

min, max = 0, 0
max = [max, a + b + c, x + y + z].max
min = [min, a + b + c, x + y + z].min

或者我可以这样做:

min, max = 0, 0
sum, sum2 = a + b + c,  x + y + z

max = [max, sum, sum2].max
min = [min, sum, sum2].min

这些变量的赋值和调用是否比我需要时计算它们更快?如果稍后在同一范围内需要这些总和,分配变量以提高可读性会更简洁。

我只是好奇 Ruby 的内部工作原理,而不是开发过程。

【问题讨论】:

  • “不能使用 minmax” – 为什么不呢?
  • 我主要是问这个问题,以确定什么在 ruby​​、赋值或计算中更快,以及为什么。不计算实际的最小值或最大值。
  • 如果 minmax 与您的示例无关,您可以删除调用并创建两个数组。但是,这种级别的优化可能毫无用处。我会选择更容易理解的代码。

标签: ruby time variable-assignment


【解决方案1】:

您可以使用Benchmark 轻松测试。

require 'benchmark'

a, b, c, x, y, z = [1,3,5,7,9,11]

n = 1000000
Benchmark.bm do |bench|
  bench.report("1") { 
    n.times do 
      min, max = 0, 0;
      max = [max, a + b + c, x + y + z].max;
      min = [min, a + b + c, x + y + z].min;
    end
  }
  bench.report("2") { 
    n.times do
      min, max = 0, 0;
      sum, sum2 = a + b + c,  x + y + z;
      max = [max, sum, sum2].max;
      min = [min, sum, sum2].min;
    end
  }
end

导致

bash-3.2$ ruby rubyspeed.rb
       user     system      total        real
1  0.160000   0.000000   0.160000 (  0.154085)
2  0.120000   0.000000   0.120000 (  0.119762)
bash-3.2$

所以第二个会更快。这可能是 a + b + cx + y + z 的重复计算导致的。

【讨论】:

  • 有趣...非常感谢。我没有使用太多这种“基准”技术。我将不得不更多地研究它。谢谢!
  • 我只是想 Ruby 可能会有类似于 Python 的 timeit 的东西,它确实做到了。不客气!
猜你喜欢
  • 1970-01-01
  • 2011-04-01
  • 2016-03-20
  • 2013-01-25
  • 2012-07-30
  • 2014-04-28
  • 2014-11-04
  • 2017-04-27
  • 1970-01-01
相关资源
最近更新 更多