【问题标题】:Ruby ActiveSupport 1.week VS 7.daysRuby ActiveSupport 1.week VS 7.days
【发布时间】:2020-06-11 16:16:01
【问题描述】:

我的问题很简短: 为什么 1.week 比 7.days 需要更多时间?

        user     system      total        real
1.week: 10.848330   0.117741  10.966071 ( 11.623818)
7.days:  6.427236   0.059907   6.487143 (  6.869768)

我看过(来自:github):

  def weeks
    ActiveSupport::Duration.weeks(self)
  end
  alias :week :weeks
  def days
    ActiveSupport::Duration.days(self)
  end
  alias :day :days

还有这个(来自:github

    SECONDS_PER_MINUTE = 60
    SECONDS_PER_HOUR   = 3600
    SECONDS_PER_DAY    = 86400
    SECONDS_PER_WEEK   = 604800
    SECONDS_PER_MONTH  = 2629746  # 1/12 of a gregorian year
    SECONDS_PER_YEAR   = 31556952 # length of a gregorian year (365.2425 days)

    PARTS_IN_SECONDS = {
      seconds: 1,
      minutes: SECONDS_PER_MINUTE,
      hours:   SECONDS_PER_HOUR,
      days:    SECONDS_PER_DAY,
      weeks:   SECONDS_PER_WEEK,
      months:  SECONDS_PER_MONTH,
      years:   SECONDS_PER_YEAR
    }.freeze

    PARTS = [:years, :months, :weeks, :days, :hours, :minutes, :seconds].freeze
      def weeks(value) #:nodoc:
        new(value * SECONDS_PER_WEEK, weeks: value)
      end
      def days(value) #:nodoc:
        new(value * SECONDS_PER_DAY, days: value)
      end

但是,对我来说,这只是一个乘法,不会花费更多时间! 而且,更糟糕的是,如果我使用7 * 24.hours,它会更快!

7 * 24.hours:  4.635190   0.058839   4.694029 (  5.049936)

感谢您的解释!

【问题讨论】:

  • 共享基准时,您应该始终尝试同时准确展示您是如何生成基准的。
  • 最可能的解释是您的基准测试方法和/或您的统计方法在某些方面存在缺陷。我始终建议任何考虑编写基准测试的人都应该阅读groups.google.com/forum/#!msg/mechanical-sympathy/m4opvy4xq3U/…整个线程,并且只有在您了解该线程中每条消息的每一个字时才开始编写基准测试。参加几门统计学课程通常也没有什么坏处。

标签: ruby-on-rails ruby activesupport


【解决方案1】:

我不确定您在这里测试的是什么(因为您没有显示实际的基准测试脚本),但由于两个代码路径非常相似,它们实际上也显示出非常相似的性能特征。

使用benchmark-ips gem(使用 Ruby 2.7.1 和 ActiveSupport 6.0.3),我可以确认它们的速度差不多:

require 'benchmark/ips'
require 'active_support/core_ext'

Benchmark.ips do |x|
  x.report("1.week") { 1.week }
  x.report("7.days") { 7.days }

  x.compare!
end

在我的机器上,我得到以下结果:

Warming up --------------------------------------
              1.week   195.777k i/100ms
              7.days   197.404k i/100ms
Calculating -------------------------------------
              1.week      1.915M (± 2.5%) i/s -      9.593M in   5.011463s
              7.days      1.855M (± 5.1%) i/s -      9.278M in   5.015019s

Comparison:
              1.week:  1915476.4 i/s
              7.days:  1855425.8 i/s - same-ish: difference falls within error

【讨论】:

  • 是的,从问题中可以看出,测试运行了一次,因此没有考虑预热时间。
猜你喜欢
  • 2022-12-02
  • 1970-01-01
  • 1970-01-01
  • 2021-03-15
  • 1970-01-01
  • 2023-01-24
  • 2015-10-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多