💡
【Ruby 3.4 Advent Calender】Time#xmlschema,iso8601 がRubyコアクラスに移動した【14日目】
Ruby 3.4 Advent Calender 14日目の記事です。
これはなに
今年 2024年12月25日にリリースされる予定の Ruby 3.4 の新機能や変更点などを1つずつ紹介していく Advent Calender になります。
基本的には NEWS に載っている機能を紹介すると思うんですがここにない機能についても書くかもしれません。
また、記事を書いてる時点ではまだ Ruby 3.4 はリリースされる前なので Ruby 3.4 がリリースされた時点で機能が変わっている 可能性があるかもしれないので注意してください。
記事のまとめは ここを参照 してください。
Time#xmlschema
と Time#iso8601
が Ruby のコア Time
クラスに移動した
Ruby 3.3 では Time#xmlschema
とその aliasi である Time#iso8601
は default gem で定義されており、メソッドを使用する際は time
を 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"
これが 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#iso8601
は Time#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倍は相当大きいので多用しているプロダクトでは実は結構効果があったりするかもしれませんね。
Discussion