💡

【Ruby 3.4 Advent Calender】Time#xmlschema,iso8601 がRubyコアクラスに移動した【14日目】

2024/12/14に公開

Ruby 3.4 Advent Calender 14日目の記事です。

これはなに

今年 2024年12月25日にリリースされる予定の Ruby 3.4 の新機能や変更点などを1つずつ紹介していく Advent Calender になります。
基本的には NEWS に載っている機能を紹介すると思うんですがここにない機能についても書くかもしれません。
また、記事を書いてる時点ではまだ Ruby 3.4 はリリースされる前なので Ruby 3.4 がリリースされた時点で機能が変わっている 可能性があるかもしれないので注意してください。
記事のまとめは ここを参照 してください。

Time#xmlschemaTime#iso8601 が Ruby のコア Time クラスに移動した

Ruby 3.3 では Time#xmlschema とその aliasi である Time#iso8601 は default gem で定義されており、メソッドを使用する際は timerequire する必要がありました。

# require "time"

time = Time.new

pp time.iso8601      # => "2024-12-13T21:43:53+09:00"
pp time.iso8601(6)   # => "2024-12-13T21:43:53.880693+09:00"

これが Ruby 3.4 からは Ruby コアの Time クラスに移動されて require せずに利用できるようになります。

# require しなくても利用できる
# require "time"

time = Time.new

pp time.iso8601      # => "2024-12-13T21:43:53+09:00"
pp time.iso8601(6)   # => "2024-12-13T21:43:53.880693+09:00"

コアクラスに移動された背景

元々 Time#xmlschema とその alias である Time#iso8601Time#strftime に依存して実装されていました。
それを Time#strftime に依存せずに専用の実装に落とし込むことでパフォーマンスを向上させたかったのがやりたかったことになります。
この対応により Ruby 3.4 では Time#xmlschema が約5倍早くなっていることがチケットで提示されています。

compare-ruby: ruby 3.4.0dev (2024-08-29T13:11:40Z master 6b08a50a62) +YJIT [arm64-darwin23]
built-ruby: ruby 3.4.0dev (2024-08-30T13:17:32Z native-xmlschema 34041ff71f) +YJIT [arm64-darwin23]
warming up......

|                        |compare-ruby|built-ruby|
|:-----------------------|-----------:|---------:|
|time._xmlschema         |      1.087M|    5.190M|
|                        |           -|     4.78x|
|utc_time._xmlschema     |      1.464M|    6.848M|
|                        |           -|     4.68x|
|time._xmlschema(6)      |    859.960k|    4.646M|
|                        |           -|     5.40x|
|utc_time._xmlschema(6)  |      1.080M|    5.917M|
|                        |           -|     5.48x|
|time._xmlschema(9)      |    893.909k|    4.668M|
|                        |           -|     5.22x|
|utc_time._xmlschema(9)  |      1.056M|    5.707M|
|                        |           -|     5.40x|

5倍は相当大きいので多用しているプロダクトでは実は結構効果があったりするかもしれませんね。

関連

GitHubで編集を提案

Discussion