Skip to content
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
</PropertyGroup>
<ItemGroup>
<PackageVersion Include="System.Runtime.CompilerServices.Unsafe" Version="6.1.0" />
<PackageVersion Include="BenchmarkDotNet" Version="0.14.0" />
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.12.0" />
<PackageVersion Include="Newtonsoft.Json" Version="13.0.3" />
Expand Down
27 changes: 19 additions & 8 deletions UnitsNet.Benchmark/Conversions/FromString/ParseUnitBenchmarks.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System;
using System.Globalization;
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Jobs;
using UnitsNet.Units;
Expand All @@ -10,44 +11,54 @@ namespace UnitsNet.Benchmark.Conversions.FromString;
[SimpleJob(RuntimeMoniker.Net80)]
public class ParseUnitBenchmarks
{
private const int NbAbbreviations = 1000;

private static readonly CultureInfo Culture = CultureInfo.InvariantCulture;
private readonly Random _random = new(42);
private string[] _densityUnits;
private string[] _massUnits;
private string[] _pressureUnits;
private string[] _volumeFlowUnits;
private string[] _volumeUnits = [];

[Params(1000)]
public int NbAbbreviations { get; set; }

[GlobalSetup(Target = nameof(ParseMassUnit))]
public void PrepareMassUnits()
{
_massUnits = _random.GetItems(["mg", "g", "kg", "lbs", "Mlbs"], NbAbbreviations);
// initializes the QuantityInfoLookup and the abbreviations cache
Mass.TryParseUnit("_invalid", Culture, out _);
}

[GlobalSetup(Target = nameof(ParseVolumeUnit))]
public void PrepareVolumeUnits()
{
_volumeUnits = _random.GetItems(["ml", "l", "L", "cm³", "m³"], NbAbbreviations);
// initializes the QuantityInfoLookup and the abbreviations cache
Volume.TryParseUnit("_invalid", Culture, out _);
}

[GlobalSetup(Target = nameof(ParseDensityUnit))]
public void PrepareDensityUnits()
{
_densityUnits = _random.GetRandomAbbreviations<DensityUnit>(UnitsNetSetup.Default.UnitAbbreviations, NbAbbreviations);
// initializes the QuantityInfoLookup and the abbreviations cache
Density.TryParseUnit("_invalid", Culture, out _);
}

[GlobalSetup(Target = nameof(ParsePressureUnit))]
public void PreparePressureUnits()
{
_pressureUnits = _random.GetRandomAbbreviations<PressureUnit>(UnitsNetSetup.Default.UnitAbbreviations, NbAbbreviations);
// initializes the QuantityInfoLookup and the abbreviations cache
Pressure.TryParseUnit("_invalid", Culture, out _);
}

[GlobalSetup(Target = nameof(ParseVolumeFlowUnit))]
public void PrepareVolumeFlowUnits()
{
_volumeFlowUnits = _random.GetRandomAbbreviations<VolumeFlowUnit>(UnitsNetSetup.Default.UnitAbbreviations, NbAbbreviations);
// initializes the QuantityInfoLookup and the abbreviations cache
VolumeFlow.TryParseUnit("_invalid", Culture, out _);
}

[Benchmark(Baseline = true)]
Expand All @@ -56,7 +67,7 @@ public MassUnit ParseMassUnit()
MassUnit unit = default;
foreach (var unitToParse in _massUnits)
{
unit = Mass.ParseUnit(unitToParse);
unit = Mass.ParseUnit(unitToParse, Culture);
}

return unit;
Expand All @@ -68,7 +79,7 @@ public VolumeUnit ParseVolumeUnit()
VolumeUnit unit = default;
foreach (var unitToParse in _volumeUnits)
{
unit = Volume.ParseUnit(unitToParse);
unit = Volume.ParseUnit(unitToParse, Culture);
}

return unit;
Expand All @@ -80,7 +91,7 @@ public DensityUnit ParseDensityUnit()
DensityUnit unit = default;
foreach (var unitToParse in _densityUnits)
{
unit = Density.ParseUnit(unitToParse);
unit = Density.ParseUnit(unitToParse, Culture);
}

return unit;
Expand All @@ -92,7 +103,7 @@ public PressureUnit ParsePressureUnit()
PressureUnit unit = default;
foreach (var unitToParse in _pressureUnits)
{
unit = Pressure.ParseUnit(unitToParse);
unit = Pressure.ParseUnit(unitToParse, Culture);
}

return unit;
Expand All @@ -104,7 +115,7 @@ public VolumeFlowUnit ParseVolumeFlowUnit()
VolumeFlowUnit unit = default;
foreach (var unitToParse in _volumeFlowUnits)
{
unit = VolumeFlow.ParseUnit(unitToParse);
unit = VolumeFlow.ParseUnit(unitToParse, Culture);
}

return unit;
Expand Down
Comment thread
lipchev marked this conversation as resolved.
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
using System;
using System.Globalization;
using System.Linq;
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Jobs;
using UnitsNet.Units;

namespace UnitsNet.Benchmark.Conversions.FromString;

[MemoryDiagnoser]
[SimpleJob(RuntimeMoniker.Net48)]
[SimpleJob(RuntimeMoniker.Net80)]
public class QuantityFromStringBenchmarks
{
private static readonly CultureInfo Culture = CultureInfo.InvariantCulture;
private static readonly string ValueToParse = 123.456.ToString(Culture);

private readonly Random _random = new(42);
private string[] _quantitiesToParse;

[Params(1000)]
public int NbAbbreviations { get; set; }

[GlobalSetup(Target = nameof(FromMassString))]
public void PrepareMassStrings()
{
// can't have "mg" or "g" (see Acceleration.StandardGravity) and who knows what more...
_quantitiesToParse = _random.GetItems(["kg", "lbs", "Mlbs"], NbAbbreviations).Select(abbreviation => $"{ValueToParse} {abbreviation}").ToArray();
}

[GlobalSetup(Target = nameof(FromVolumeUnitAbbreviation))]
public void PrepareVolumeStrings()
{
_quantitiesToParse = _random.GetItems(["ml", "l", "cm³", "m³"], NbAbbreviations).Select(abbreviation => $"{ValueToParse} {abbreviation}").ToArray();;
}

[GlobalSetup(Target = nameof(FromPressureUnitAbbreviation))]
public void PreparePressureUnits()
{
_quantitiesToParse = _random.GetRandomAbbreviations<PressureUnit>(UnitsNetSetup.Default.UnitAbbreviations, NbAbbreviations).Select(abbreviation => $"{ValueToParse} {abbreviation}").ToArray();;
}

[GlobalSetup(Target = nameof(FromVolumeFlowUnitAbbreviation))]
public void PrepareVolumeFlowUnits()
{
// can't have "bpm" (see Frequency)
_quantitiesToParse =
_random.GetItems(
UnitsNetSetup.Default.UnitAbbreviations.GetAllUnitAbbreviationsForQuantity(typeof(VolumeFlowUnit)).Where(x => x != "bpm").ToArray(),
NbAbbreviations).Select(abbreviation => $"{ValueToParse} {abbreviation}").ToArray();
}

[Benchmark(Baseline = true)]
public IQuantity FromMassString()
{
IQuantity quantity = null;
foreach (var quantityString in _quantitiesToParse)
{
quantity = Quantity.Parse(Culture, typeof(Mass), quantityString);
}

return quantity;
}

[Benchmark(Baseline = false)]
public IQuantity FromVolumeUnitAbbreviation()
{
IQuantity quantity = null;
foreach (var quantityString in _quantitiesToParse)
{
quantity = Quantity.Parse(Culture, typeof(Volume), quantityString);
}

return quantity;
}

[Benchmark(Baseline = false)]
public IQuantity FromPressureUnitAbbreviation()
{
IQuantity quantity = null;
foreach (var quantityString in _quantitiesToParse)
{
quantity = Quantity.Parse(Culture, typeof(Pressure), quantityString);
}

return quantity;
}

[Benchmark(Baseline = false)]
public IQuantity FromVolumeFlowUnitAbbreviation()
{
IQuantity quantity = null;
foreach (var quantityString in _quantitiesToParse)
{
quantity = Quantity.Parse(Culture, typeof(VolumeFlow), quantityString);
}

return quantity;
}
}
Comment thread
lipchev marked this conversation as resolved.
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
using System;
using System.Globalization;
using System.Linq;
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Jobs;
using UnitsNet.Units;

namespace UnitsNet.Benchmark.Conversions.FromString;

[MemoryDiagnoser]
[SimpleJob(RuntimeMoniker.Net48)]
[SimpleJob(RuntimeMoniker.Net80)]
public class QuantityFromUnitAbbreviationBenchmarks
{
private static readonly CultureInfo Culture = CultureInfo.InvariantCulture;
private readonly Random _random = new(42);
private string[] _massUnits;
private string[] _pressureUnits;
private string[] _volumeFlowUnits;
private string[] _volumeUnits = [];

[Params(1000)]
public int NbAbbreviations { get; set; }

[GlobalSetup(Target = nameof(FromMassUnitAbbreviation))]
public void PrepareMassUnits()
{
// can't have "mg" or "g" (see Acceleration.StandardGravity) and who knows what more...
_massUnits = _random.GetItems(["kg", "lbs", "Mlbs"], NbAbbreviations);
}

[GlobalSetup(Target = nameof(FromVolumeUnitAbbreviation))]
public void PrepareVolumeUnits()
{
_volumeUnits = _random.GetItems(["ml", "l", "cm³", "m³"], NbAbbreviations);
}

[GlobalSetup(Target = nameof(FromPressureUnitAbbreviation))]
public void PreparePressureUnits()
{
_pressureUnits = _random.GetRandomAbbreviations<PressureUnit>(UnitsNetSetup.Default.UnitAbbreviations, NbAbbreviations);
}

[GlobalSetup(Target = nameof(FromVolumeFlowUnitAbbreviation))]
public void PrepareVolumeFlowUnits()
{
// can't have "bpm" (see Frequency)
_volumeFlowUnits =
_random.GetItems(
UnitsNetSetup.Default.UnitAbbreviations.GetAllUnitAbbreviationsForQuantity(typeof(VolumeFlowUnit)).Where(x => x != "bpm").ToArray(),
NbAbbreviations);
}

[Benchmark(Baseline = true)]
public IQuantity FromMassUnitAbbreviation()
{
IQuantity quantity = null;
foreach (var unitToParse in _massUnits)
{
quantity = Quantity.FromUnitAbbreviation(Culture, 1, unitToParse);
}

return quantity;
}

[Benchmark(Baseline = false)]
public IQuantity FromVolumeUnitAbbreviation()
{
IQuantity quantity = null;
foreach (var unitToParse in _volumeUnits)
{
quantity = Quantity.FromUnitAbbreviation(Culture, 1, unitToParse);
}

return quantity;
}

[Benchmark(Baseline = false)]
public IQuantity FromPressureUnitAbbreviation()
{
IQuantity quantity = null;
foreach (var unitToParse in _pressureUnits)
{
quantity = Quantity.FromUnitAbbreviation(Culture, 1, unitToParse);
}

return quantity;
}

[Benchmark(Baseline = false)]
public IQuantity FromVolumeFlowUnitAbbreviation()
{
IQuantity quantity = null;
foreach (var unitToParse in _volumeFlowUnits)
{
quantity = Quantity.FromUnitAbbreviation(Culture, 1, unitToParse);
}

return quantity;
}
}
Loading