我的问题很简短:为什么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)
感谢您的解释!
我不确定您在这里要测试什么(因为您没有显示实际的基准脚本),但是由于两个代码路径都非常相似,因此它们实际上也表现出非常相似的性能特征。
使用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