Ruby ActiveSupport 1.week VS 7.days

问题描述 投票:-2回答:1

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

        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)

感谢您的解释!

ruby-on-rails ruby activesupport
1个回答
3
投票

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

使用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
© www.soinside.com 2019 - 2024. All rights reserved.