UnitsNet
UnitsNet copied to clipboard
Bad Performance on first Power.From() call in .netCore
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.
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
toclass
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?
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.
@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. https://github.com/angularsen/UnitsNet/issues/1069#issuecomment-1205775413
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.
@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 |
@tmilnthorp Some benchmarks posted above, can't spot much different in v5 versions in this simple test setup, but significantly faster than v4.
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.
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)
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()
; onlyPower, QuantityInfo, QuantityFormatter, BaseUnits, UnitAbbreviationsCache
. In v4.144 and latest it invokes ALL 120 quantity static constructors even if onlyPower
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
4.144
Latest
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.
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()