mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Speed-up TimeWithZone to String conversion
I've noticed that `String(model.created_at)` is performing poorly in comparision with other fields. The source of the problem is a way `Kernel#String` works: it first tries to call `to_str` (which causes `NoMethodError` in `method_missing`) and then calls `to_s`. Performance tests: tz = Time.zone.now Benchmark.ips do |x| x.report { String(tz) } end Without this code: Calculating ------------------------------------- 572 i/100ms ------------------------------------------------- 10177.7 (±18.2%) i/s - 48620 in 5.000325s With this code: Calculating ------------------------------------- 1518 i/100ms ------------------------------------------------- 138984.2 (±10.1%) i/s - 677028 in 4.974897s
This commit is contained in:
parent
f632f79b8d
commit
3a08882030
1 changed files with 8 additions and 0 deletions
|
@ -353,6 +353,14 @@ module ActiveSupport
|
|||
initialize(variables[0].utc, ::Time.find_zone(variables[1]), variables[2].utc)
|
||||
end
|
||||
|
||||
# respond_to_missing? is not called in some cases, such as when type conversion is
|
||||
# performed with Kernel#String
|
||||
def respond_to?(sym, include_priv = false)
|
||||
# ensure that we're not going to throw and rescue from NoMethodError in method_missing which is slow
|
||||
return false if sym.to_sym == :to_str
|
||||
super
|
||||
end
|
||||
|
||||
# Ensure proxy class responds to all methods that underlying time instance
|
||||
# responds to.
|
||||
def respond_to_missing?(sym, include_priv)
|
||||
|
|
Loading…
Reference in a new issue