Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Optimizations #51

Merged
merged 11 commits into from
Sep 3, 2022
Merged

Conversation

jnyrup
Copy link
Contributor

@jnyrup jnyrup commented Aug 21, 2022

Inspired by the optimizations back in 4b5a5d7 I looked for additional low-hanging fruit.

As some changes might add more code complexity to your likings compared to their performance gains, I've split the changes into separate commits and added per-commit benchmarks.

The total statistics over the changes:

CPU

  Before [ns] After [ns] Absolute [ns] Relative [%]
net6 – 0 timezones 985.0 268.2 -716.8 0.272
net48 – 0 timezones 2314.7 627.2 -1687.5 0.271
net6 – 1 timezone 817.5 218.3 -599.2 0.267
net48 – 1 timezone 1965.9 584.3 -1381.6 0.297
net6 – 3 timezones 1078.2 285.0 -793.2 0.264
net48 – 3 timezones 2710.9 689.2 -2021.7 0.254

Memory

  Before [B] After [B] Absolute [B] Relative [%]
net6 – 0 timezones 1956 184 -1772 0.094
net48 – 0 timezones 3031 1091 -865 0.360
net6 – 1 timezone 1434 112 -1844 0.078
net48 – 1 timezone 2499 947 -1009 0.379
net6 – 3 timezones 2171 248 -1708 0.114
net48 – 3 timezones 3277 1155 -801 0.352

Benchmarks

Benchmark code
BenchmarkRunner.Run<MyClass>();

[MemoryDiagnoser]
[SimpleJob(RuntimeMoniker.Net48)]
[SimpleJob(RuntimeMoniker.Net60)]
public class MyClass
{
    public IEnumerable<object[]> Coordinates()
    {
        yield return new object[] { 0d, 0d }; // 0 timezones, uses CalculateOffsetHoursFromLongitude
        yield return new object[] { -31.55, 159.0833 }; // 1 timezone
        yield return new object[] { 47.589983, 7.587417 }; // 3 timezones
    }

    [Benchmark]
    [ArgumentsSource(nameof(Coordinates))]
    public TimeZoneResult GetTimeZone(double lat, double lon) => TimeZoneLookup.GetTimeZone(lat, lon);
}

6f148f3 (master)

Method Runtime lat lon Mean Error StdDev Gen 0 Allocated
GetTimeZone .NET 6.0 -31.55 159.0833 985.0 ns 4.16 ns 3.89 ns 0.3109 1.91 KB
GetTimeZone .NET Framework 4.8 -31.55 159.0833 2,314.7 ns 12.15 ns 10.77 ns 0.4807 2.96 KB
GetTimeZone .NET 6.0 0 0 817.5 ns 5.43 ns 5.08 ns 0.2279 1.4 KB
GetTimeZone .NET Framework 4.8 0 0 1,965.9 ns 6.81 ns 6.04 ns 0.3929 2.44 KB
GetTimeZone .NET 6.0 47.589983 7.587417 1,078.2 ns 4.99 ns 4.42 ns 0.3452 2.12 KB
GetTimeZone .NET Framework 4.8 47.589983 7.587417 2,710.9 ns 12.11 ns 10.74 ns 0.5188 3.2 KB

65a4456

Method Runtime lat lon Mean Error StdDev Gen 0 Allocated
GetTimeZone .NET 6.0 -31.55 159.0833 999.0 ns 4.31 ns 4.03 ns 0.3109 1.91 KB
GetTimeZone .NET Framework 4.8 -31.55 159.0833 2,333.2 ns 14.91 ns 12.45 ns 0.4807 2.96 KB
GetTimeZone .NET 6.0 0 0 814.3 ns 8.41 ns 7.87 ns 0.2279 1.4 KB
GetTimeZone .NET Framework 4.8 0 0 1,981.7 ns 10.00 ns 9.35 ns 0.3929 2.44 KB
GetTimeZone .NET 6.0 47.589983 7.587417 1,069.6 ns 12.13 ns 10.75 ns 0.3452 2.12 KB
GetTimeZone .NET Framework 4.8 47.589983 7.587417 2,740.3 ns 12.35 ns 10.95 ns 0.5188 3.2 KB

d827248

Method Runtime lat lon Mean Error StdDev Gen 0 Allocated
GetTimeZone .NET 6.0 -31.55 159.0833 529.9 ns 1.22 ns 1.02 ns 0.1497 944 B
GetTimeZone .NET Framework 4.8 -31.55 159.0833 1,505.0 ns 5.13 ns 4.80 ns 0.2861 1805 B
GetTimeZone .NET 6.0 0 0 371.1 ns 1.59 ns 1.48 ns 0.0877 552 B
GetTimeZone .NET Framework 4.8 0 0 1,071.4 ns 13.03 ns 12.19 ns 0.2270 1436 B
GetTimeZone .NET 6.0 47.589983 7.587417 679.8 ns 4.36 ns 4.08 ns 0.1860 1168 B
GetTimeZone .NET Framework 4.8 47.589983 7.587417 1,762.9 ns 9.31 ns 8.25 ns 0.3262 2062 B

ebfd6a8

Method Runtime lat lon Mean Error StdDev Gen 0 Allocated
GetTimeZone .NET 6.0 -31.55 159.0833 467.3 ns 2.26 ns 2.11 ns 0.1388 872 B
GetTimeZone .NET Framework 4.8 -31.55 159.0833 1,242.1 ns 21.79 ns 18.20 ns 0.2728 1725 B
GetTimeZone .NET 6.0 0 0 351.9 ns 1.58 ns 1.48 ns 0.0877 552 B
GetTimeZone .NET Framework 4.8 0 0 1,049.6 ns 16.19 ns 15.14 ns 0.2270 1436 B
GetTimeZone .NET 6.0 47.589983 7.587417 536.7 ns 3.61 ns 3.38 ns 0.1516 952 B
GetTimeZone .NET Framework 4.8 47.589983 7.587417 1,317.0 ns 12.98 ns 12.15 ns 0.2880 1821 B

b1c0e50

Method Runtime lat lon Mean Error StdDev Gen 0 Allocated
GetTimeZone .NET 6.0 -31.55 159.0833 474.1 ns 3.28 ns 2.74 ns 0.1326 832 B
GetTimeZone .NET Framework 4.8 -31.55 159.0833 1,265.6 ns 12.87 ns 12.04 ns 0.2651 1677 B
GetTimeZone .NET 6.0 0 0 344.1 ns 5.81 ns 4.85 ns 0.0877 552 B
GetTimeZone .NET Framework 4.8 0 0 1,081.0 ns 6.20 ns 5.17 ns 0.2270 1436 B
GetTimeZone .NET 6.0 47.589983 7.587417 538.0 ns 5.65 ns 5.28 ns 0.1459 920 B
GetTimeZone .NET Framework 4.8 47.589983 7.587417 1,352.1 ns 9.55 ns 8.93 ns 0.2823 1781 B

010ba57

Method Runtime lat lon Mean Error StdDev Gen 0 Allocated
GetTimeZone .NET 6.0 -31.55 159.0833 471.6 ns 2.75 ns 2.44 ns 0.1326 832 B
GetTimeZone .NET Framework 4.8 -31.55 159.0833 1,226.4 ns 14.41 ns 13.48 ns 0.2651 1677 B
GetTimeZone .NET 6.0 0 0 295.1 ns 3.17 ns 2.96 ns 0.0749 472 B
GetTimeZone .NET Framework 4.8 0 0 976.7 ns 10.06 ns 9.41 ns 0.2060 1308 B
GetTimeZone .NET 6.0 47.589983 7.587417 540.5 ns 3.80 ns 3.55 ns 0.1459 920 B
GetTimeZone .NET Framework 4.8 47.589983 7.587417 1,322.5 ns 6.96 ns 6.51 ns 0.2823 1781 B

121aa56

Method Runtime lat lon Mean Error StdDev Gen 0 Allocated
GetTimeZone .NET 6.0 -31.55 159.0833 302.9 ns 1.55 ns 1.45 ns 0.0610 384 B
GetTimeZone .NET Framework 4.8 -31.55 159.0833 1,019.2 ns 11.65 ns 10.89 ns 0.1965 1244 B
GetTimeZone .NET 6.0 0 0 227.5 ns 1.87 ns 1.74 ns 0.0420 264 B
GetTimeZone .NET Framework 4.8 0 0 863.8 ns 7.10 ns 6.29 ns 0.1574 995 B
GetTimeZone .NET 6.0 47.589983 7.587417 331.6 ns 4.94 ns 4.62 ns 0.0710 448 B
GetTimeZone .NET Framework 4.8 47.589983 7.587417 1,101.1 ns 5.05 ns 4.48 ns 0.2098 1324 B

fe8bd98

Method Runtime lat lon Mean Error StdDev Gen 0 Allocated
GetTimeZone .NET 6.0 -31.55 159.0833 273.2 ns 3.93 ns 3.68 ns 0.0534 336 B
GetTimeZone .NET Framework 4.8 -31.55 159.0833 938.6 ns 5.38 ns 4.20 ns 0.1793 1139 B
GetTimeZone .NET 6.0 0 0 225.7 ns 2.10 ns 1.96 ns 0.0420 264 B
GetTimeZone .NET Framework 4.8 0 0 861.2 ns 10.40 ns 9.22 ns 0.1574 995 B
GetTimeZone .NET 6.0 47.589983 7.587417 291.5 ns 2.80 ns 2.62 ns 0.0634 400 B
GetTimeZone .NET Framework 4.8 47.589983 7.587417 979.7 ns 4.58 ns 4.28 ns 0.1907 1204 B

878bd47

Method Runtime lat lon Mean Error StdDev Gen 0 Allocated
GetTimeZone .NET 6.0 -31.55 159.0833 266.6 ns 2.00 ns 1.87 ns 0.0467 296 B
GetTimeZone .NET Framework 4.8 -31.55 159.0833 928.7 ns 11.62 ns 10.30 ns 0.1726 1091 B
GetTimeZone .NET 6.0 0 0 216.7 ns 1.81 ns 1.69 ns 0.0355 224 B
GetTimeZone .NET Framework 4.8 0 0 852.8 ns 9.06 ns 8.48 ns 0.1497 947 B
GetTimeZone .NET 6.0 47.589983 7.587417 286.1 ns 3.72 ns 3.48 ns 0.0572 360 B
GetTimeZone .NET Framework 4.8 47.589983 7.587417 957.8 ns 9.60 ns 8.98 ns 0.1831 1155 B

610211e

Method Runtime lat lon Mean Error StdDev Gen 0 Allocated
GetTimeZone .NET 6.0 -31.55 159.0833 270.5 ns 0.87 ns 0.81 ns 0.0420 264 B
GetTimeZone .NET Framework 4.8 -31.55 159.0833 927.5 ns 15.73 ns 14.71 ns 0.1726 1091 B
GetTimeZone .NET 6.0 0 0 221.3 ns 1.84 ns 1.72 ns 0.0305 192 B
GetTimeZone .NET Framework 4.8 0 0 851.7 ns 7.81 ns 7.30 ns 0.1497 947 B
GetTimeZone .NET 6.0 47.589983 7.587417 295.2 ns 2.84 ns 2.66 ns 0.0520 328 B
GetTimeZone .NET Framework 4.8 47.589983 7.587417 963.3 ns 5.05 ns 4.72 ns 0.1831 1155 B

8e08835

Method Runtime lat lon Mean Error StdDev Gen 0 Allocated
GetTimeZone .NET 6.0 -31.55 159.0833 268.2 ns 2.29 ns 2.03 ns 0.0291 184 B
GetTimeZone .NET Framework 4.8 -31.55 159.0833 915.1 ns 12.85 ns 12.02 ns 0.1726 1091 B
GetTimeZone .NET 6.0 0 0 218.3 ns 2.97 ns 2.48 ns 0.0176 112 B
GetTimeZone .NET Framework 4.8 0 0 846.4 ns 10.45 ns 9.77 ns 0.1497 947 B
GetTimeZone .NET 6.0 47.589983 7.587417 285.0 ns 0.59 ns 0.49 ns 0.0391 248 B
GetTimeZone .NET Framework 4.8 47.589983 7.587417 963.2 ns 3.62 ns 3.39 ns 0.1831 1155 B

4f11918

Method Runtime lat lon Mean Error StdDev Gen 0 Allocated
GetTimeZone .NET 6.0 -31.55 159.0833 268.1 ns 2.27 ns 2.12 ns 0.0291 184 B
GetTimeZone .NET Framework 4.8 -31.55 159.0833 627.2 ns 5.95 ns 5.28 ns 0.1726 1091 B
GetTimeZone .NET 6.0 0 0 218.4 ns 1.67 ns 1.56 ns 0.0176 112 B
GetTimeZone .NET Framework 4.8 0 0 584.3 ns 6.12 ns 5.72 ns 0.1497 947 B
GetTimeZone .NET 6.0 47.589983 7.587417 295.3 ns 4.30 ns 4.02 ns 0.0391 248 B
GetTimeZone .NET Framework 4.8 47.589983 7.587417 689.2 ns 8.02 ns 7.11 ns 0.1831 1155 B

@mattjohnsonpint
Copy link
Owner

Thanks for this!

FYI, I'm on vacation this week, so it may be a little while before I can review.

@mattjohnsonpint mattjohnsonpint merged commit 217661b into mattjohnsonpint:master Sep 3, 2022
@mattjohnsonpint
Copy link
Owner

Thanks for this! I may make some further updates, but this is great work. 👍

@jnyrup jnyrup deleted the Optimizations branch September 4, 2022 05:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants