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

Bad Performance on first Power.From() call in .netCore #1126

Open
JeCodeFu opened this issue Aug 29, 2022 · 10 comments · Fixed by #1210
Open

Bad Performance on first Power.From() call in .netCore #1126

JeCodeFu opened this issue Aug 29, 2022 · 10 comments · Fixed by #1210
Labels

Comments

@JeCodeFu
Copy link

Description
The very first call on Power.From takes up to several seconds.
All the following calls are fine (regarding the performance).

Environment

  • .net Core 3.1
  • 32bit ARM Platform
  • Embedded Linux

Repro/Code
var result = Power.From(5, PowerUnit.Watt);

Expected behavior
The call should return within milliseconds, but it takes up to more than 10 seconds.

Additional context
I Experienced this issue after updating from Version 4.72.0 to Version 4.144.0.
It did not happen in the older version.

@JeCodeFu JeCodeFu added the bug label Aug 29, 2022
@angularsen
Copy link
Owner

Hi, this is a known issue: #965

Due to a large number of types and type members for all our 100+ quantities and 1000+ units, the JIT spends a long time on the initial usages.

We don't currently have a solution to this, but a few ideas have been floated:

  • Break up into core nuget + specific quantity nugets. Only add what you need.
  • Switch from struct to class to make use of inheritance
  • Make use of extension methods more to avoid duplicating methods for every N quantities
  • .NET 7 brings AOT, maybe applications can make use of that to speed up JIT?

@Jens88
Copy link

Jens88 commented Sep 14, 2022

Hi
Thank you for the answer and the ideas how to deal with this.
I did not read all the release notes between V4.72.0 and V4.144.0.
But since you mentioned the large number of types and type members is the causing this issue;

Did you add a lot of new types after V4.72.0?

I know i run on a "low power" cpu and thus i cannot compare my time measurement with all the benchmark tests done listed in issue #965. But the difference between the two versions i mentioned is a factor of 100 times slower (or even more).
So this makes me think that there is yet another problem, unless you did add hundreds of types after V4.72.

@angularsen
Copy link
Owner

@Jens88 I'm not sure, we added a bunch of units for sure, but 100x sounds a lot.

Are you able to profile the difference between the two? Maybe find what exact hotspot in the code differs between them. Maybe we have introduced some regression.

There was one known performance regression, but it should have been fixed in 4.142.0.
#1069 (comment)

@stale
Copy link

stale bot commented Jun 18, 2023

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.

@stale stale bot added the wontfix label Jun 18, 2023
angularsen added a commit that referenced this issue Jun 18, 2023
…1210)

Fixes #1126 
Refs #1238 

A quick draft to move the unit abbreviations into resource files. I also want to move methods for getting culture-specific abbreviations to the individual quantities.

This should:
- Reduce initialization time by removing the MapGeneratedLocalizations methods (TODO)
- Reduce in-memory footprint by only loading a requested culture
- Allow formatting to use methods on the quantities themselves
  - Which should allow for better extensibility as well
- Remove the unit abbreviations cache (deprecate)

### TODOs
- [ ] Test fallback to invariant culture `export DOTNET_SYSTEM_GLOBALIZATION_INVARIANT='1'` #1238 

---------

Co-authored-by: Andreas Gullberg Larsen <andreas.larsen84@gmail.com>
@angularsen
Copy link
Owner

@JeCodeFu Long overdue, but I think this improved a lot in v5, plus some recent improvements in #1210.

Could you give it another go?

I can't replicate the extreme slowness you reported though, since you were testing on ARM32 and I'm testing on a fast computer:

The very first call on Power.From takes up to several seconds.

Maybe the application complexity and size also affects how much work JIT needs to do for UnitsNet.

Benchmark

Comparing 4.144.0 with latest v5.

Using TimeItSharp to run a net7.0 console app with this code:

Console.WriteLine(Power.From(5, PowerUnit.Watt));

Results

Before: 850 ms
After: 523 ms

This includes the overhead of starting and running the console app. The idea was to capture any slowness in the JIT.

Before (v4.144.0)

For some reason this crashed the timeit tool, so I had to run fewer iterations on this nuget.

(ins)$ dotnet timeit perf_before.json
TimeIt (v. 0.0.8.0) by Tony Redondo

Warmup count: 5
Count: 10
Number of Scenarios: 1
Exporters: ConsoleExporter, JsonExporter, Datadog

Scenario: Default
  Warming up .....
    Duration: 4,2442191s
  Run ..........
    Duration: 8,4839588s
Name Mean StdDev StdErr Min Max P95 P90 Outliers
Default 843,5567ms 5,356ms 1,6937ms 835,3823ms 850,371ms 850,371ms 849,9721ms 0
├>process.internal_duration_ms 800,9216 4,920471 1,55599 794,7264 809,472 809,472 808,57088 0
├>process.time_to_end_ms 16,29339 1,85835 0,587662 14,0489 18,4476 18,4476 18,429853 0
├>process.time_to_start_ms 26,34177 0,316539 0,100098 25,8493 26,8823 26,8823 26,781357 0
├>runtime.dotnet.cpu.percent 4,483375 0,18614 0,058862 4,246667 4,766667 4,766667 4,734889 0
├>runtime.dotnet.cpu.system 203,385417 47,298275 14,957028 125 270,833333 270,833333 257,465278 0
├>runtime.dotnet.cpu.user 874,348958 35,224503 11,138966 820,3125 916,666667 916,666667 916,666667 0
├>runtime.dotnet.mem.committed 17316024,32 222527,309147 70369,313849 17165516,8 17899008 17899008 17734553,6 0
├>runtime.dotnet.threads.contention_count 0 0 0 0 0 0 0 0
├>runtime.dotnet.threads.contention_time 0 0 0 0 0 0 0 0
├>runtime.dotnet.threads.count 12,8025 0,00527 0,001667 12,8 12,8125 12,8125 12,8125 0
└>runtime.dotnet.threads.workers_count 1,8725 0,004025 0,001273 1,866667 1,875 1,875 1,875 0

After (v5)

(ins)$ dotnet timeit perf.json
TimeIt (v. 0.0.8.0) by Tony Redondo

Warmup count: 10
Count: 20
Number of Scenarios: 1
Exporters: ConsoleExporter, JsonExporter, Datadog

Scenario: Default
  Warming up ..........
    Duration: 5,3425719s
  Run ....................
    Duration: 10,5619372s
Name Mean StdDev StdErr Min Max P95 P90 Outliers
Default 523,2774ms 3,2313ms 0,7413ms 516,9314ms 530,2838ms 529,344ms 526,9549ms 1
├>process.internal_duration_ms 482,944 3,098095 0,692755 476,3648 488,96 488,81664 487,461547 0
├>process.time_to_end_ms 14,252445 0,355083 0,079399 13,5538 14,7657 14,76206 14,751633 0
├>process.time_to_start_ms 26,380142 0,389723 0,089408 25,8933 27,1318 27,09361 26,988073 0
├>runtime.dotnet.cpu.percent 4,203333 0,317501 0,070995 3,755556 4,766667 4,766667 4,713704 0
├>runtime.dotnet.cpu.system 161,458333 77,457144 17,319944 34,722222 312,5 300,347222 277,777778 0
├>runtime.dotnet.cpu.user 848,958333 66,145126 14,7905 694,444444 937,5 937,5 924,768519 0
├>runtime.dotnet.mem.committed 17302459,733333 115220,946958 25764,186983 17084871,111111 17476266,666667 17454603,377778 17412702,814815 0
├>runtime.dotnet.threads.contention_count 0 0 0 0 0 0 0 0
├>runtime.dotnet.threads.contention_time 0 0 0 0 0 0 0 0
├>runtime.dotnet.threads.count 12,666667 0 0 12,666667 12,666667 12,666667 12,666667 0
└>runtime.dotnet.threads.workers_count 1,777778 0 0 1,777778 1,777778 1,777778 1,777778 0

@angularsen
Copy link
Owner

@tmilnthorp Some benchmarks posted above, can't spot much different in v5 versions in this simple test setup, but significantly faster than v4.

@Jens88
Copy link

Jens88 commented Jul 11, 2023

Hi Andreas

Thanks for the update on this issue. Since we went back in version we had no actual suffer anymore.

I quickly tested the newest version. Unfortunately all the "Undefined" entities vanished, so my code needs some adaption to get back running again. I will come back to this thread when I converted the code and have a test setup again.

@Jens88
Copy link

Jens88 commented Jul 11, 2023

So now the measurement of the very first call of Power.From() call:

V4.72 : 633ms
V4.144: 17256ms (this was the version i reported here)
V5.21 : 9121 ms

So to summarize:

  • Yes there is an improvement from Version 4.144
  • But the issue is not solved yet, since compared with the V4.72 there is still an increase of 8'488ms (factor 15 slower)

@angularsen
Copy link
Owner

angularsen commented Jul 11, 2023

cc @tmilnthorp

Thanks for reporting back and testing again.

Clearly we did something between 4.72 and 4.144 to make the JIT choke hard on this platform, that is still not fixed in v5.

I don't have much time to profile and look into this anytime soon, but I did run PerfView to get the JITStats for our 3 sample apps:

  • PerfTests\PerfTest_Startup_v4_72_0
  • PerfTests\PerfTest_Startup_v4_144_0
  • PerfTests\PerfTest_Startup

Summary of JIT durations

What v4.72 [ms / count] v4.144 [ms / count] latest [ms / count]
Quantity static .cctor() 0 19 1
Static ctors of ~120 quantity types 0 57 70
UnitAbbreviationsCache..cctor() 43 0 0
UnitConverter.RegisterDefaultConversions 0 84 108
UnitConverter.SetConversionFunction 0 26 26
QuantityInfo 2 ms / 21 71 ms / 940 52 ms / 500
UnitInfo 0 ms / 6 11 ms / 240 15 ms / 240
Quantity.GetQuantityTypes (new) 0 0 51
...HashSet`1[UnitsNet.Units...] 1 135 0
System.Linq 2 180 25
Other 18 152 79
Total 78 ms 872 ms 470 ms

Take-aways

The main difference in 4.72 from 4.144 and latest:

  • A lot less JITing (140 compilations vs 8000 and 4000 compilations)
  • Fewer generics, latest has a lot of variants in QuantityInfo, SetConversionFunction and various dictionaries/collection types
  • Fewer invoked static constructors .cctor(); only Power, QuantityInfo, QuantityFormatter, BaseUnits, UnitAbbreviationsCache. In v4.144 and latest it invokes ALL 120 quantity static constructors even if only Power is used.

If we can avoid invoking all static ctors for all 120 quantities, we should be able to improve this.
I'm not sure how much we can reduce the use of generics, it has some real benefits, but maybe there are some redundancies here.

PerfView data

Raw data here:
PerfViewData_UnitsNet_comparison_4.72_4.144_latest.xlsx

4.72

image
image

4.144

image
image

Latest

image
image

@angularsen angularsen reopened this Jul 11, 2023
@stale stale bot removed the wontfix label Jul 11, 2023
@Anthonywolfe
Copy link
Contributor

Hi, I want to throw in some performance metrics I've measured on my Arm64 device.

Environment:

  • .NET 8
  • Xilinx Zynq UltraScale+ MPSoC (ARM64)
  • Linux 6.1.30-xilinx-v2023.2 aarch64
  • UnitsNet 5.50.0

Due to some shenanigans I end up loading 4 instances of UnitsNet using a AssemblyLoadContext, Though that's outside of the scope of this issue and I'm just bringing it up to explain why RegisterDefaultConversions shows up 4 times in the below image.

Here are some measurements I got from DotTrace I'm still a bit new to this tool so if there is any more in-depth info you'd like me to grab I can.

image

Stacktrace
    100%   RegisterDefaultConversions  •  3,723 ms  •  UnitsNet.UnitConverter.RegisterDefaultConversions(UnitConverter)
    44.9%   [JIT]  •  1,671 ms
    1.32%   [Unknown]  •  49 ms
  ► 1.21%   RegisterDefaultConversions  •  45 ms  •  UnitsNet.ForcePerLength.RegisterDefaultConversions(UnitConverter)
  ► 0.82%   RegisterDefaultConversions  •  31 ms  •  UnitsNet.Density.RegisterDefaultConversions(UnitConverter)
  ► 0.82%   RegisterDefaultConversions  •  31 ms  •  UnitsNet.PowerDensity.RegisterDefaultConversions(UnitConverter)
  ► 0.66%   RegisterDefaultConversions  •  25 ms  •  UnitsNet.VolumeFlow.RegisterDefaultConversions(UnitConverter)
  ► 0.65%   RegisterDefaultConversions  •  24 ms  •  UnitsNet.Length.RegisterDefaultConversions(UnitConverter)
  ► 0.65%   RegisterDefaultConversions  •  24 ms  •  UnitsNet.MassConcentration.RegisterDefaultConversions(UnitConverter)
  ► 0.62%   RegisterDefaultConversions  •  23 ms  •  UnitsNet.AbsorbedDoseOfIonizingRadiation.RegisterDefaultConversions(UnitConverter)
  ► 0.60%   RegisterDefaultConversions  •  22 ms  •  UnitsNet.Volume.RegisterDefaultConversions(UnitConverter)
  ► 0.60%   RegisterDefaultConversions  •  22 ms  •  UnitsNet.Pressure.RegisterDefaultConversions(UnitConverter)
  ► 0.59%   RegisterDefaultConversions  •  22 ms  •  UnitsNet.Power.RegisterDefaultConversions(UnitConverter)
  ► 0.59%   RegisterDefaultConversions  •  22 ms  •  UnitsNet.Speed.RegisterDefaultConversions(UnitConverter)
  ► 0.59%   RegisterDefaultConversions  •  22 ms  •  UnitsNet.Energy.RegisterDefaultConversions(UnitConverter)
  ► 0.55%   RegisterDefaultConversions  •  21 ms  •  UnitsNet.ElectricPotentialChangeRate.RegisterDefaultConversions(UnitConverter)
  ► 0.54%   RegisterDefaultConversions  •  20 ms  •  UnitsNet.AmountOfSubstance.RegisterDefaultConversions(UnitConverter)
  ► 0.53%   RegisterDefaultConversions  •  20 ms  •  UnitsNet.Mass.RegisterDefaultConversions(UnitConverter)
  ► 0.53%   RegisterDefaultConversions  •  20 ms  •  UnitsNet.BitRate.RegisterDefaultConversions(UnitConverter)
  ► 0.52%   RegisterDefaultConversions  •  19 ms  •  UnitsNet.Acceleration.RegisterDefaultConversions(UnitConverter)
  ► 0.48%   RegisterDefaultConversions  •  18 ms  •  UnitsNet.Radioactivity.RegisterDefaultConversions(UnitConverter)
  ► 0.47%   RegisterDefaultConversions  •  18 ms  •  UnitsNet.MassFlow.RegisterDefaultConversions(UnitConverter)
  ► 0.47%   RegisterDefaultConversions  •  17 ms  •  UnitsNet.Jerk.RegisterDefaultConversions(UnitConverter)
  ► 0.47%   RegisterDefaultConversions  •  17 ms  •  UnitsNet.RotationalStiffness.RegisterDefaultConversions(UnitConverter)
  ► 0.47%   RegisterDefaultConversions  •  17 ms  •  UnitsNet.CoefficientOfThermalExpansion.RegisterDefaultConversions(UnitConverter)
  ► 0.46%   RegisterDefaultConversions  •  17 ms  •  UnitsNet.PressureChangeRate.RegisterDefaultConversions(UnitConverter)
  ► 0.46%   RegisterDefaultConversions  •  17 ms  •  UnitsNet.Area.RegisterDefaultConversions(UnitConverter)
  ► 0.46%   RegisterDefaultConversions  •  17 ms  •  UnitsNet.Temperature.RegisterDefaultConversions(UnitConverter)
  ► 0.45%   RegisterDefaultConversions  •  17 ms  •  UnitsNet.SpecificEnergy.RegisterDefaultConversions(UnitConverter)
  ► 0.45%   RegisterDefaultConversions  •  17 ms  •  UnitsNet.LinearPowerDensity.RegisterDefaultConversions(UnitConverter)
  ► 0.45%   RegisterDefaultConversions  •  17 ms  •  UnitsNet.VolumeConcentration.RegisterDefaultConversions(UnitConverter)
  ► 0.45%   RegisterDefaultConversions  •  17 ms  •  UnitsNet.PorousMediumPermeability.RegisterDefaultConversions(UnitConverter)
  ► 0.45%   RegisterDefaultConversions  •  17 ms  •  UnitsNet.AreaMomentOfInertia.RegisterDefaultConversions(UnitConverter)
  ► 0.45%   RegisterDefaultConversions  •  17 ms  •  UnitsNet.MassFraction.RegisterDefaultConversions(UnitConverter)
  ► 0.44%   RegisterDefaultConversions  •  16 ms  •  UnitsNet.ElectricCurrentGradient.RegisterDefaultConversions(UnitConverter)
  ► 0.44%   RegisterDefaultConversions  •  16 ms  •  UnitsNet.MassMomentOfInertia.RegisterDefaultConversions(UnitConverter)
  ► 0.43%   RegisterDefaultConversions  •  16 ms  •  UnitsNet.Torque.RegisterDefaultConversions(UnitConverter)
  ► 0.43%   RegisterDefaultConversions  •  16 ms  •  UnitsNet.Capacitance.RegisterDefaultConversions(UnitConverter)
  ► 0.43%   RegisterDefaultConversions  •  16 ms  •  UnitsNet.RadiationEquivalentDose.RegisterDefaultConversions(UnitConverter)
  ► 0.43%   RegisterDefaultConversions  •  16 ms  •  UnitsNet.MassFlux.RegisterDefaultConversions(UnitConverter)
  ► 0.43%   RegisterDefaultConversions  •  16 ms  •  UnitsNet.MolarMass.RegisterDefaultConversions(UnitConverter)
  ► 0.43%   RegisterDefaultConversions  •  16 ms  •  UnitsNet.SpecificWeight.RegisterDefaultConversions(UnitConverter)
  ► 0.43%   RegisterDefaultConversions  •  16 ms  •  UnitsNet.MolarFlow.RegisterDefaultConversions(UnitConverter)
  ► 0.42%   RegisterDefaultConversions  •  16 ms  •  UnitsNet.Force.RegisterDefaultConversions(UnitConverter)
  ► 0.42%   RegisterDefaultConversions  •  16 ms  •  UnitsNet.Permittivity.RegisterDefaultConversions(UnitConverter)
  ► 0.42%   RegisterDefaultConversions  •  16 ms  •  UnitsNet.ReactiveEnergy.RegisterDefaultConversions(UnitConverter)
  ► 0.42%   RegisterDefaultConversions  •  16 ms  •  UnitsNet.TorquePerLength.RegisterDefaultConversions(UnitConverter)
  ► 0.42%   RegisterDefaultConversions  •  16 ms  •  UnitsNet.HeatFlux.RegisterDefaultConversions(UnitConverter)
  ► 0.42%   RegisterDefaultConversions  •  16 ms  •  UnitsNet.Information.RegisterDefaultConversions(UnitConverter)
  ► 0.42%   RegisterDefaultConversions  •  16 ms  •  UnitsNet.ElectricCurrentDensity.RegisterDefaultConversions(UnitConverter)
  ► 0.42%   RegisterDefaultConversions  •  16 ms  •  UnitsNet.WarpingMomentOfInertia.RegisterDefaultConversions(UnitConverter)
  ► 0.42%   RegisterDefaultConversions  •  16 ms  •  UnitsNet.StandardVolumeFlow.RegisterDefaultConversions(UnitConverter)
  ► 0.42%   RegisterDefaultConversions  •  15 ms  •  UnitsNet.VolumetricHeatCapacity.RegisterDefaultConversions(UnitConverter)
  ► 0.42%   RegisterDefaultConversions  •  15 ms  •  UnitsNet.ApparentEnergy.RegisterDefaultConversions(UnitConverter)
  ► 0.42%   RegisterDefaultConversions  •  15 ms  •  UnitsNet.RadiationExposure.RegisterDefaultConversions(UnitConverter)
  ► 0.41%   RegisterDefaultConversions  •  15 ms  •  UnitsNet.Duration.RegisterDefaultConversions(UnitConverter)
  ► 0.41%   RegisterDefaultConversions  •  15 ms  •  UnitsNet.Luminance.RegisterDefaultConversions(UnitConverter)
  ► 0.41%   RegisterDefaultConversions  •  15 ms  •  UnitsNet.Irradiation.RegisterDefaultConversions(UnitConverter)
  ► 0.41%   RegisterDefaultConversions  •  15 ms  •  UnitsNet.Angle.RegisterDefaultConversions(UnitConverter)
  ► 0.41%   RegisterDefaultConversions  •  15 ms  •  UnitsNet.RotationalSpeed.RegisterDefaultConversions(UnitConverter)
  ► 0.41%   RegisterDefaultConversions  •  15 ms  •  UnitsNet.VolumePerLength.RegisterDefaultConversions(UnitConverter)
  ► 0.41%   RegisterDefaultConversions  •  15 ms  •  UnitsNet.Molarity.RegisterDefaultConversions(UnitConverter)
  ► 0.41%   RegisterDefaultConversions  •  15 ms  •  UnitsNet.RotationalAcceleration.RegisterDefaultConversions(UnitConverter)
  ► 0.41%   RegisterDefaultConversions  •  15 ms  •  UnitsNet.AreaDensity.RegisterDefaultConversions(UnitConverter)
  ► 0.41%   RegisterDefaultConversions  •  15 ms  •  UnitsNet.Irradiance.RegisterDefaultConversions(UnitConverter)
  ► 0.41%   RegisterDefaultConversions  •  15 ms  •  UnitsNet.Impulse.RegisterDefaultConversions(UnitConverter)
  ► 0.41%   RegisterDefaultConversions  •  15 ms  •  UnitsNet.Frequency.RegisterDefaultConversions(UnitConverter)
  ► 0.40%   RegisterDefaultConversions  •  15 ms  •  UnitsNet.ForceChangeRate.RegisterDefaultConversions(UnitConverter)
  ► 0.40%   RegisterDefaultConversions  •  15 ms  •  UnitsNet.LinearDensity.RegisterDefaultConversions(UnitConverter)
  ► 0.40%   RegisterDefaultConversions  •  15 ms  •  UnitsNet.ElectricResistivity.RegisterDefaultConversions(UnitConverter)
  ► 0.40%   RegisterDefaultConversions  •  15 ms  •  UnitsNet.TemperatureChangeRate.RegisterDefaultConversions(UnitConverter)
  ► 0.40%   RegisterDefaultConversions  •  15 ms  •  UnitsNet.ElectricCharge.RegisterDefaultConversions(UnitConverter)
  ► 0.40%   RegisterDefaultConversions  •  15 ms  •  UnitsNet.ElectricPotentialDc.RegisterDefaultConversions(UnitConverter)
  ► 0.40%   RegisterDefaultConversions  •  15 ms  •  UnitsNet.EnergyDensity.RegisterDefaultConversions(UnitConverter)
  ► 0.40%   RegisterDefaultConversions  •  15 ms  •  UnitsNet.ThermalResistance.RegisterDefaultConversions(UnitConverter)
  ► 0.39%   RegisterDefaultConversions  •  15 ms  •  UnitsNet.Luminosity.RegisterDefaultConversions(UnitConverter)
  ► 0.39%   RegisterDefaultConversions  •  15 ms  •  UnitsNet.TemperatureGradient.RegisterDefaultConversions(UnitConverter)
  ► 0.39%   RegisterDefaultConversions  •  15 ms  •  UnitsNet.VolumeFlowPerArea.RegisterDefaultConversions(UnitConverter)
  ► 0.39%   RegisterDefaultConversions  •  15 ms  •  UnitsNet.TemperatureDelta.RegisterDefaultConversions(UnitConverter)
  ► 0.39%   RegisterDefaultConversions  •  15 ms  •  UnitsNet.Turbidity.RegisterDefaultConversions(UnitConverter)
  ► 0.39%   RegisterDefaultConversions  •  15 ms  •  UnitsNet.ReciprocalArea.RegisterDefaultConversions(UnitConverter)
  ► 0.39%   RegisterDefaultConversions  •  14 ms  •  UnitsNet.ElectricChargeDensity.RegisterDefaultConversions(UnitConverter)
  ► 0.39%   RegisterDefaultConversions  •  14 ms  •  UnitsNet.SpecificEntropy.RegisterDefaultConversions(UnitConverter)
  ► 0.39%   RegisterDefaultConversions  •  14 ms  •  UnitsNet.Scalar.RegisterDefaultConversions(UnitConverter)
  ► 0.38%   RegisterDefaultConversions  •  14 ms  •  UnitsNet.KinematicViscosity.RegisterDefaultConversions(UnitConverter)
  ► 0.38%   RegisterDefaultConversions  •  14 ms  •  UnitsNet.ReciprocalLength.RegisterDefaultConversions(UnitConverter)
  ► 0.38%   RegisterDefaultConversions  •  14 ms  •  UnitsNet.ElectricPotentialAc.RegisterDefaultConversions(UnitConverter)
  ► 0.38%   RegisterDefaultConversions  •  14 ms  •  UnitsNet.ElectricConductivity.RegisterDefaultConversions(UnitConverter)
  ► 0.38%   RegisterDefaultConversions  •  14 ms  •  UnitsNet.ReactivePower.RegisterDefaultConversions(UnitConverter)
  ► 0.38%   RegisterDefaultConversions  •  14 ms  •  UnitsNet.MolarEntropy.RegisterDefaultConversions(UnitConverter)
  ► 0.38%   RegisterDefaultConversions  •  14 ms  •  UnitsNet.ElectricResistance.RegisterDefaultConversions(UnitConverter)
  ► 0.38%   RegisterDefaultConversions  •  14 ms  •  UnitsNet.SpecificVolume.RegisterDefaultConversions(UnitConverter)
  ► 0.38%   RegisterDefaultConversions  •  14 ms  •  UnitsNet.ApparentPower.RegisterDefaultConversions(UnitConverter)
  ► 0.38%   RegisterDefaultConversions  •  14 ms  •  UnitsNet.AmplitudeRatio.RegisterDefaultConversions(UnitConverter)
  ► 0.37%   RegisterDefaultConversions  •  14 ms  •  UnitsNet.LeakRate.RegisterDefaultConversions(UnitConverter)
  ► 0.37%   RegisterDefaultConversions  •  14 ms  •  UnitsNet.Illuminance.RegisterDefaultConversions(UnitConverter)
  ► 0.37%   RegisterDefaultConversions  •  14 ms  •  UnitsNet.SolidAngle.RegisterDefaultConversions(UnitConverter)
  ► 0.37%   RegisterDefaultConversions  •  14 ms  •  UnitsNet.Compressibility.RegisterDefaultConversions(UnitConverter)
  ► 0.37%   RegisterDefaultConversions  •  14 ms  •  UnitsNet.DynamicViscosity.RegisterDefaultConversions(UnitConverter)
  ► 0.37%   RegisterDefaultConversions  •  14 ms  •  UnitsNet.ThermalConductivity.RegisterDefaultConversions(UnitConverter)
  ► 0.37%   RegisterDefaultConversions  •  14 ms  •  UnitsNet.Ratio.RegisterDefaultConversions(UnitConverter)
  ► 0.37%   RegisterDefaultConversions  •  14 ms  •  UnitsNet.ElectricCurrent.RegisterDefaultConversions(UnitConverter)
  ► 0.37%   RegisterDefaultConversions  •  14 ms  •  UnitsNet.RotationalStiffnessPerLength.RegisterDefaultConversions(UnitConverter)
  ► 0.37%   RegisterDefaultConversions  •  14 ms  •  UnitsNet.Entropy.RegisterDefaultConversions(UnitConverter)
  ► 0.36%   RegisterDefaultConversions  •  14 ms  •  UnitsNet.ElectricSurfaceChargeDensity.RegisterDefaultConversions(UnitConverter)
  ► 0.36%   RegisterDefaultConversions  •  14 ms  •  UnitsNet.Molality.RegisterDefaultConversions(UnitConverter)
  ► 0.36%   RegisterDefaultConversions  •  14 ms  •  UnitsNet.Magnetization.RegisterDefaultConversions(UnitConverter)
  ► 0.36%   RegisterDefaultConversions  •  13 ms  •  UnitsNet.MagneticFlux.RegisterDefaultConversions(UnitConverter)
  ► 0.36%   RegisterDefaultConversions  •  13 ms  •  UnitsNet.RatioChangeRate.RegisterDefaultConversions(UnitConverter)
  ► 0.36%   RegisterDefaultConversions  •  13 ms  •  UnitsNet.SpecificFuelConsumption.RegisterDefaultConversions(UnitConverter)
  ► 0.36%   RegisterDefaultConversions  •  13 ms  •  UnitsNet.HeatTransferCoefficient.RegisterDefaultConversions(UnitConverter)
  ► 0.36%   RegisterDefaultConversions  •  13 ms  •  UnitsNet.ElectricInductance.RegisterDefaultConversions(UnitConverter)
  ► 0.36%   RegisterDefaultConversions  •  13 ms  •  UnitsNet.MagneticField.RegisterDefaultConversions(UnitConverter)
  ► 0.36%   RegisterDefaultConversions  •  13 ms  •  UnitsNet.MolarEnergy.RegisterDefaultConversions(UnitConverter)
  ► 0.35%   RegisterDefaultConversions  •  13 ms  •  UnitsNet.ElectricConductance.RegisterDefaultConversions(UnitConverter)
  ► 0.35%   RegisterDefaultConversions  •  13 ms  •  UnitsNet.VitaminA.RegisterDefaultConversions(UnitConverter)
  ► 0.35%   RegisterDefaultConversions  •  13 ms  •  UnitsNet.Permeability.RegisterDefaultConversions(UnitConverter)
  ► 0.35%   RegisterDefaultConversions  •  13 ms  •  UnitsNet.ElectricField.RegisterDefaultConversions(UnitConverter)
  ► 0.35%   RegisterDefaultConversions  •  13 ms  •  UnitsNet.ElectricAdmittance.RegisterDefaultConversions(UnitConverter)
  ► 0.35%   RegisterDefaultConversions  •  13 ms  •  UnitsNet.LuminousIntensity.RegisterDefaultConversions(UnitConverter)
  ► 0.34%   RegisterDefaultConversions  •  13 ms  •  UnitsNet.Level.RegisterDefaultConversions(UnitConverter)
  ► 0.34%   RegisterDefaultConversions  •  13 ms  •  UnitsNet.FuelEfficiency.RegisterDefaultConversions(UnitConverter)
  ► 0.34%   RegisterDefaultConversions  •  13 ms  •  UnitsNet.LuminousFlux.RegisterDefaultConversions(UnitConverter)
  ► 0.34%   RegisterDefaultConversions  •  13 ms  •  UnitsNet.PowerRatio.RegisterDefaultConversions(UnitConverter)
  ► 0.34%   RegisterDefaultConversions  •  13 ms  •  UnitsNet.BrakeSpecificFuelConsumption.RegisterDefaultConversions(UnitConverter)
  ► 0.33%   RegisterDefaultConversions  •  12 ms  •  UnitsNet.RelativeHumidity.RegisterDefaultConversions(UnitConverter)
    0.26%   GetMemberList  •  9.8 ms  •  System.RuntimeType+RuntimeTypeCache+MemberInfoCache`1.GetMemberList(MemberListType, String, CacheType)
    0.03%   InitializeCache  •  1.2 ms  •  System.RuntimeType.InitializeCache()
  ► <0.01%   GetQuantityTypes  •  0.3 ms  •  UnitsNet.Quantity.GetQuantityTypes()

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging a pull request may close this issue.

4 participants