mattjohnsonpint / TimeZoneNames

Provides a complete source of localized time zone names and abbreviations.
MIT License
199 stars 32 forks source link

Use JSON source generator #87

Closed jnyrup closed 1 year ago

jnyrup commented 2 years ago

With the switch to System.Text.Json in #85 we can further improve TimeZoneNames for NativeAOT applications by switching to a source generated TimeZoneData JSON deserializer.

Unfortunately System.Text.Json does not (yet) support init only properties, see https://github.com/dotnet/runtime/issues/58770. For this draft I went with public setters, but alternatively a parameterized constructor should also work.

When I ran DataBuilder the order of the output changed, which I guess is either due non-stable dictionary sorting or that the CurrentCulture on my machine is a mix of en-US/en-GB and da-DK (reported as en-DK).

I made a quick benchmark on calling TimeZoneData.Load() on .NET6 using Benchmarkdotnet which only focuses on the performance benefits of switching to a source generated JSON deserializer. branch Mean Error StdDev Ratio
main 174.5 ms 2.98 ms 2.49 ms 1.00
PR 114.8 ms 2.25 ms 2.10 ms 0.66

Some stats on a TimeZoneNames.NativeAot application.

main:

PR:

mattjohnsonpint commented 1 year ago

Thanks!