From ba1156ff8611d06059b5aa3a029c8faca124329b Mon Sep 17 00:00:00 2001 From: KaliCZ Date: Wed, 11 Oct 2023 16:45:31 +0200 Subject: [PATCH 1/2] Added more benchmarks for basic methods. --- .../Option/OptionBenchmarks.cs | 362 ++++++++++-------- 1 file changed, 206 insertions(+), 156 deletions(-) diff --git a/src/FuncSharp.Benchmarks/Option/OptionBenchmarks.cs b/src/FuncSharp.Benchmarks/Option/OptionBenchmarks.cs index e5978aa..13e50af 100644 --- a/src/FuncSharp.Benchmarks/Option/OptionBenchmarks.cs +++ b/src/FuncSharp.Benchmarks/Option/OptionBenchmarks.cs @@ -2,6 +2,11 @@ namespace FuncSharp.Benchmarks; +public class ReferenceType +{ + public string Text { get; set; } +} + [MemoryDiagnoser] public class OptionBenchmarks { @@ -9,167 +14,212 @@ public class OptionBenchmarks private static readonly string StringValue; private static readonly Option NonEmptyOption; private static readonly Option EmptyOption; + private static readonly Option ReferenceTypeNonEmptyOption; + private static readonly Option ReferenceTypeEmptyOption; static OptionBenchmarks() { Object = new object(); StringValue = "Some String"; NonEmptyOption = "non-empty".ToOption(); - EmptyOption = Option.Empty(); - } - - // Last Result - 22.8.2023 - 11.6 ns - 80 B - [Benchmark] - public void Creation_AllCases() - { - Option.Create(42); - Option.Create(42 as int?); - Option.Create(null as int?); - - Option.Create(Object); - Option.Create(null as object); - } - - // Last Result - 22.8.2023 - 4.7 ns - 0 B - [Benchmark] - public void IsEmptyOrNonEmpty_AllCases() - { - var a = NonEmptyOption.NonEmpty; - var b = EmptyOption.NonEmpty; - var c = NonEmptyOption.IsEmpty; - var d = EmptyOption.IsEmpty; - } - - // Last Result - 22.8.2023 - 1.2 ns - 0 B - [Benchmark] - public void Get() - { - NonEmptyOption.Get(); - } - - // Last Result - 22.8.2023 - 2.4 ns - 0 B - [Benchmark] - public void GetOrElse_NonEmpty() - { - NonEmptyOption.GetOrElse(StringValue); - } - - // Last Result - 22.8.2023 - 1.6 ns - 0 B - [Benchmark] - public void GetOrElse_Empty() - { - EmptyOption.GetOrElse(StringValue); - } - - // Last Result - 22.8.2023 - 3.0 ns - 0 B - [Benchmark] - public void Lazy_GetOrElse_NonEmpty() - { - NonEmptyOption.GetOrElse(_ => StringValue); - } - - // Last Result - 22.8.2023 - 2.6 ns - 0 B - [Benchmark] - public void Lazy_GetOrElse_Empty() - { - EmptyOption.GetOrElse(_ => StringValue); - } - - // Last Result - 22.8.2023 - 3.9 ns - 0 B - [Benchmark] - public void OrElse_NonEmpty_ToNonEmpty() - { - NonEmptyOption.OrElse(_ => NonEmptyOption); - } - - // Last Result - 22.8.2023 - 3.4 ns - 0 B - [Benchmark] - public void OrElse_NonEmpty_ToEmpty() - { - NonEmptyOption.OrElse(_ => EmptyOption); - } - - // Last Result - 22.8.2023 - 2.7 ns - 0 B - [Benchmark] - public void OrElse_Empty_ToNonEmpty() - { - EmptyOption.OrElse(_ => NonEmptyOption); - } - - // Last Result - 22.8.2023 - 2.7 ns - 0 B - [Benchmark] - public void OrElse_Empty_ToEmpty() - { - EmptyOption.OrElse(_ => EmptyOption); - } - - // Last Result - 22.8.2023 - 7.4 ns - 32 B - [Benchmark] - public void Map_NonEmpty() - { - NonEmptyOption.Map(o => StringValue); - } - - // Last Result - 22.8.2023 - 5.9 ns - 0 B - [Benchmark] - public void Map_Empty() - { - EmptyOption.Map(o => StringValue); - } - - // Last Result - 22.8.2023 - 4.6 ns - 0 B - [Benchmark] - public void FlatMap_NonEmpty_ToNonEmpty() - { - NonEmptyOption.FlatMap(o => NonEmptyOption); - } - - // Last Result - 22.8.2023 - 4.6 ns - 0 B - [Benchmark] - public void FlatMap_NonEmpty_ToEmpty() - { - NonEmptyOption.FlatMap(o => EmptyOption); - } - - // Last Result - 22.8.2023 - 6.0 ns - 0 B - [Benchmark] - public void FlatMap_Empty_ToNonEmpty() - { - EmptyOption.FlatMap(o => NonEmptyOption); - } - - // Last Result - 22.8.2023 - 6.0 ns - 0 B - [Benchmark] - public void FlatMap_Empty_ToEmpty() - { - EmptyOption.FlatMap(o => EmptyOption); - } - - // Last Result - 22.8.2023 - 5.2 ns - 0 B - [Benchmark] - public void Matching_NonEmpty() - { - NonEmptyOption.Match(_ => true, _ => false); - } - - // Last Result - 22.8.2023 - 5.3 ns - 0 B - [Benchmark] - public void Matching_Empty() - { - EmptyOption.Match(_ => true, _ => false); - } - - // Last Result - 27.8.2023 - 3.1 ns - 32 B - [Benchmark] - public void AsReadOnlyList_NonEmpty() - { - NonEmptyOption.AsReadOnlyList(); - } - - // Last Result - 27.8.2023 - 0.3 ns - 0 B - [Benchmark] - public void AsReadOnlyList_Empty() - { - EmptyOption.AsReadOnlyList(); + ReferenceTypeNonEmptyOption = Option.Valued(new ReferenceType { Text= "non-empty" }); + ReferenceTypeEmptyOption = Option.Empty(); + } + + // // Last Result - 22.8.2023 - 11.6 ns - 80 B + // [Benchmark] + // public void Creation_AllCases() + // { + // Option.Create(42); + // Option.Create(42 as int?); + // Option.Create(null as int?); + // + // Option.Create(Object); + // Option.Create(null as object); + // } + // + // // Last Result - 22.8.2023 - 4.7 ns - 0 B + // [Benchmark] + // public void IsEmptyOrNonEmpty_AllCases() + // { + // var a = NonEmptyOption.NonEmpty; + // var b = EmptyOption.NonEmpty; + // var c = NonEmptyOption.IsEmpty; + // var d = EmptyOption.IsEmpty; + // } + // + // // Last Result - 22.8.2023 - 1.2 ns - 0 B + // [Benchmark] + // public void Get() + // { + // NonEmptyOption.Get(); + // } + // + // // Last Result - 22.8.2023 - 2.4 ns - 0 B + // [Benchmark] + // public void GetOrElse_NonEmpty() + // { + // NonEmptyOption.GetOrElse(StringValue); + // } + // + // // Last Result - 22.8.2023 - 1.6 ns - 0 B + // [Benchmark] + // public void GetOrElse_Empty() + // { + // EmptyOption.GetOrElse(StringValue); + // } + // + // // Last Result - 22.8.2023 - 3.0 ns - 0 B + // [Benchmark] + // public void Lazy_GetOrElse_NonEmpty() + // { + // NonEmptyOption.GetOrElse(_ => StringValue); + // } + // + // // Last Result - 22.8.2023 - 2.6 ns - 0 B + // [Benchmark] + // public void Lazy_GetOrElse_Empty() + // { + // EmptyOption.GetOrElse(_ => StringValue); + // } + // + // // Last Result - 22.8.2023 - 3.9 ns - 0 B + // [Benchmark] + // public void OrElse_NonEmpty_ToNonEmpty() + // { + // NonEmptyOption.OrElse(_ => NonEmptyOption); + // } + // + // // Last Result - 22.8.2023 - 3.4 ns - 0 B + // [Benchmark] + // public void OrElse_NonEmpty_ToEmpty() + // { + // NonEmptyOption.OrElse(_ => EmptyOption); + // } + // + // // Last Result - 22.8.2023 - 2.7 ns - 0 B + // [Benchmark] + // public void OrElse_Empty_ToNonEmpty() + // { + // EmptyOption.OrElse(_ => NonEmptyOption); + // } + // + // // Last Result - 22.8.2023 - 2.7 ns - 0 B + // [Benchmark] + // public void OrElse_Empty_ToEmpty() + // { + // EmptyOption.OrElse(_ => EmptyOption); + // } + // + // // Last Result - 22.8.2023 - 7.4 ns - 32 B + // [Benchmark] + // public void Map_NonEmpty() + // { + // NonEmptyOption.Map(o => StringValue); + // } + // + // // Last Result - 22.8.2023 - 5.9 ns - 0 B + // [Benchmark] + // public void Map_Empty() + // { + // EmptyOption.Map(o => StringValue); + // } + // + // // Last Result - 22.8.2023 - 4.6 ns - 0 B + // [Benchmark] + // public void FlatMap_NonEmpty_ToNonEmpty() + // { + // NonEmptyOption.FlatMap(o => NonEmptyOption); + // } + // + // // Last Result - 22.8.2023 - 4.6 ns - 0 B + // [Benchmark] + // public void FlatMap_NonEmpty_ToEmpty() + // { + // NonEmptyOption.FlatMap(o => EmptyOption); + // } + // + // // Last Result - 22.8.2023 - 6.0 ns - 0 B + // [Benchmark] + // public void FlatMap_Empty_ToNonEmpty() + // { + // EmptyOption.FlatMap(o => NonEmptyOption); + // } + // + // // Last Result - 22.8.2023 - 6.0 ns - 0 B + // [Benchmark] + // public void FlatMap_Empty_ToEmpty() + // { + // EmptyOption.FlatMap(o => EmptyOption); + // } + // + // // Last Result - 22.8.2023 - 5.2 ns - 0 B + // [Benchmark] + // public void Matching_NonEmpty() + // { + // NonEmptyOption.Match(_ => true, _ => false); + // } + // + // // Last Result - 22.8.2023 - 5.3 ns - 0 B + // [Benchmark] + // public void Matching_Empty() + // { + // EmptyOption.Match(_ => true, _ => false); + // } + // + // // Last Result - 27.8.2023 - 3.1 ns - 32 B + // [Benchmark] + // public void AsReadOnlyList_NonEmpty() + // { + // NonEmptyOption.AsReadOnlyList(); + // } + // + // // Last Result - 27.8.2023 - 0.3 ns - 0 B + // [Benchmark] + // public void AsReadOnlyList_Empty() + // { + // EmptyOption.AsReadOnlyList(); + // } + + // Last Result - 11.10.2023 - 1.82 ns - 0 B + [Benchmark] + public void MapPlusGetOrNull_WithFunc_NonEmpty() + { + var text = ReferenceTypeNonEmptyOption.Map(value => value.Text).GetOrNull(); + } + + // Last Result - 11.10.2023 - 3.61 ns - 0 B + [Benchmark] + public void MapPlusGetOrNull_WithFunc_Empty() + { + var text = ReferenceTypeEmptyOption.Map(value => value.Text).GetOrNull(); + } + + // Last Result - 11.10.2023 - 1.66 ns - 0 B + [Benchmark] + public void GetOrNull_WithFunc_NonEmpty() + { + var text = ReferenceTypeNonEmptyOption.GetOrNull(value => value.Text); + } + + // Last Result - 11.10.2023 - 0.60 ns - 0 B + [Benchmark] + public void GetOrNull_WithFunc_Empty() + { + var text = ReferenceTypeEmptyOption.GetOrNull(value => value.Text); + } + + // Last Result - 11.10.2023 - 0.08 ns - 0 B + [Benchmark] + public void GetOrNull_WithFunc_VanillaCsharp_NonEmpty() + { + var text = ReferenceTypeNonEmptyOption.GetOrNull()?.Text; + } + + // Last Result - 11.10.2023 - 0.07 ns - 0 B + [Benchmark] + public void GetOrNull_WithFunc_VanillaCsharp_Empty() + { + var text = ReferenceTypeEmptyOption.GetOrNull()?.Text; } } \ No newline at end of file From a886893939d76e9b030efd0d8328e857cc4586f5 Mon Sep 17 00:00:00 2001 From: KaliCZ Date: Wed, 11 Oct 2023 16:45:50 +0200 Subject: [PATCH 2/2] I forgot to uncomment the existing benchmarks. --- .../Option/OptionBenchmarks.cs | 308 +++++++++--------- 1 file changed, 154 insertions(+), 154 deletions(-) diff --git a/src/FuncSharp.Benchmarks/Option/OptionBenchmarks.cs b/src/FuncSharp.Benchmarks/Option/OptionBenchmarks.cs index 13e50af..8533475 100644 --- a/src/FuncSharp.Benchmarks/Option/OptionBenchmarks.cs +++ b/src/FuncSharp.Benchmarks/Option/OptionBenchmarks.cs @@ -26,160 +26,160 @@ static OptionBenchmarks() ReferenceTypeEmptyOption = Option.Empty(); } - // // Last Result - 22.8.2023 - 11.6 ns - 80 B - // [Benchmark] - // public void Creation_AllCases() - // { - // Option.Create(42); - // Option.Create(42 as int?); - // Option.Create(null as int?); - // - // Option.Create(Object); - // Option.Create(null as object); - // } - // - // // Last Result - 22.8.2023 - 4.7 ns - 0 B - // [Benchmark] - // public void IsEmptyOrNonEmpty_AllCases() - // { - // var a = NonEmptyOption.NonEmpty; - // var b = EmptyOption.NonEmpty; - // var c = NonEmptyOption.IsEmpty; - // var d = EmptyOption.IsEmpty; - // } - // - // // Last Result - 22.8.2023 - 1.2 ns - 0 B - // [Benchmark] - // public void Get() - // { - // NonEmptyOption.Get(); - // } - // - // // Last Result - 22.8.2023 - 2.4 ns - 0 B - // [Benchmark] - // public void GetOrElse_NonEmpty() - // { - // NonEmptyOption.GetOrElse(StringValue); - // } - // - // // Last Result - 22.8.2023 - 1.6 ns - 0 B - // [Benchmark] - // public void GetOrElse_Empty() - // { - // EmptyOption.GetOrElse(StringValue); - // } - // - // // Last Result - 22.8.2023 - 3.0 ns - 0 B - // [Benchmark] - // public void Lazy_GetOrElse_NonEmpty() - // { - // NonEmptyOption.GetOrElse(_ => StringValue); - // } - // - // // Last Result - 22.8.2023 - 2.6 ns - 0 B - // [Benchmark] - // public void Lazy_GetOrElse_Empty() - // { - // EmptyOption.GetOrElse(_ => StringValue); - // } - // - // // Last Result - 22.8.2023 - 3.9 ns - 0 B - // [Benchmark] - // public void OrElse_NonEmpty_ToNonEmpty() - // { - // NonEmptyOption.OrElse(_ => NonEmptyOption); - // } - // - // // Last Result - 22.8.2023 - 3.4 ns - 0 B - // [Benchmark] - // public void OrElse_NonEmpty_ToEmpty() - // { - // NonEmptyOption.OrElse(_ => EmptyOption); - // } - // - // // Last Result - 22.8.2023 - 2.7 ns - 0 B - // [Benchmark] - // public void OrElse_Empty_ToNonEmpty() - // { - // EmptyOption.OrElse(_ => NonEmptyOption); - // } - // - // // Last Result - 22.8.2023 - 2.7 ns - 0 B - // [Benchmark] - // public void OrElse_Empty_ToEmpty() - // { - // EmptyOption.OrElse(_ => EmptyOption); - // } - // - // // Last Result - 22.8.2023 - 7.4 ns - 32 B - // [Benchmark] - // public void Map_NonEmpty() - // { - // NonEmptyOption.Map(o => StringValue); - // } - // - // // Last Result - 22.8.2023 - 5.9 ns - 0 B - // [Benchmark] - // public void Map_Empty() - // { - // EmptyOption.Map(o => StringValue); - // } - // - // // Last Result - 22.8.2023 - 4.6 ns - 0 B - // [Benchmark] - // public void FlatMap_NonEmpty_ToNonEmpty() - // { - // NonEmptyOption.FlatMap(o => NonEmptyOption); - // } - // - // // Last Result - 22.8.2023 - 4.6 ns - 0 B - // [Benchmark] - // public void FlatMap_NonEmpty_ToEmpty() - // { - // NonEmptyOption.FlatMap(o => EmptyOption); - // } - // - // // Last Result - 22.8.2023 - 6.0 ns - 0 B - // [Benchmark] - // public void FlatMap_Empty_ToNonEmpty() - // { - // EmptyOption.FlatMap(o => NonEmptyOption); - // } - // - // // Last Result - 22.8.2023 - 6.0 ns - 0 B - // [Benchmark] - // public void FlatMap_Empty_ToEmpty() - // { - // EmptyOption.FlatMap(o => EmptyOption); - // } - // - // // Last Result - 22.8.2023 - 5.2 ns - 0 B - // [Benchmark] - // public void Matching_NonEmpty() - // { - // NonEmptyOption.Match(_ => true, _ => false); - // } - // - // // Last Result - 22.8.2023 - 5.3 ns - 0 B - // [Benchmark] - // public void Matching_Empty() - // { - // EmptyOption.Match(_ => true, _ => false); - // } - // - // // Last Result - 27.8.2023 - 3.1 ns - 32 B - // [Benchmark] - // public void AsReadOnlyList_NonEmpty() - // { - // NonEmptyOption.AsReadOnlyList(); - // } - // - // // Last Result - 27.8.2023 - 0.3 ns - 0 B - // [Benchmark] - // public void AsReadOnlyList_Empty() - // { - // EmptyOption.AsReadOnlyList(); - // } + // Last Result - 22.8.2023 - 11.6 ns - 80 B + [Benchmark] + public void Creation_AllCases() + { + Option.Create(42); + Option.Create(42 as int?); + Option.Create(null as int?); + + Option.Create(Object); + Option.Create(null as object); + } + + // Last Result - 22.8.2023 - 4.7 ns - 0 B + [Benchmark] + public void IsEmptyOrNonEmpty_AllCases() + { + var a = NonEmptyOption.NonEmpty; + var b = EmptyOption.NonEmpty; + var c = NonEmptyOption.IsEmpty; + var d = EmptyOption.IsEmpty; + } + + // Last Result - 22.8.2023 - 1.2 ns - 0 B + [Benchmark] + public void Get() + { + NonEmptyOption.Get(); + } + + // Last Result - 22.8.2023 - 2.4 ns - 0 B + [Benchmark] + public void GetOrElse_NonEmpty() + { + NonEmptyOption.GetOrElse(StringValue); + } + + // Last Result - 22.8.2023 - 1.6 ns - 0 B + [Benchmark] + public void GetOrElse_Empty() + { + EmptyOption.GetOrElse(StringValue); + } + + // Last Result - 22.8.2023 - 3.0 ns - 0 B + [Benchmark] + public void Lazy_GetOrElse_NonEmpty() + { + NonEmptyOption.GetOrElse(_ => StringValue); + } + + // Last Result - 22.8.2023 - 2.6 ns - 0 B + [Benchmark] + public void Lazy_GetOrElse_Empty() + { + EmptyOption.GetOrElse(_ => StringValue); + } + + // Last Result - 22.8.2023 - 3.9 ns - 0 B + [Benchmark] + public void OrElse_NonEmpty_ToNonEmpty() + { + NonEmptyOption.OrElse(_ => NonEmptyOption); + } + + // Last Result - 22.8.2023 - 3.4 ns - 0 B + [Benchmark] + public void OrElse_NonEmpty_ToEmpty() + { + NonEmptyOption.OrElse(_ => EmptyOption); + } + + // Last Result - 22.8.2023 - 2.7 ns - 0 B + [Benchmark] + public void OrElse_Empty_ToNonEmpty() + { + EmptyOption.OrElse(_ => NonEmptyOption); + } + + // Last Result - 22.8.2023 - 2.7 ns - 0 B + [Benchmark] + public void OrElse_Empty_ToEmpty() + { + EmptyOption.OrElse(_ => EmptyOption); + } + + // Last Result - 22.8.2023 - 7.4 ns - 32 B + [Benchmark] + public void Map_NonEmpty() + { + NonEmptyOption.Map(o => StringValue); + } + + // Last Result - 22.8.2023 - 5.9 ns - 0 B + [Benchmark] + public void Map_Empty() + { + EmptyOption.Map(o => StringValue); + } + + // Last Result - 22.8.2023 - 4.6 ns - 0 B + [Benchmark] + public void FlatMap_NonEmpty_ToNonEmpty() + { + NonEmptyOption.FlatMap(o => NonEmptyOption); + } + + // Last Result - 22.8.2023 - 4.6 ns - 0 B + [Benchmark] + public void FlatMap_NonEmpty_ToEmpty() + { + NonEmptyOption.FlatMap(o => EmptyOption); + } + + // Last Result - 22.8.2023 - 6.0 ns - 0 B + [Benchmark] + public void FlatMap_Empty_ToNonEmpty() + { + EmptyOption.FlatMap(o => NonEmptyOption); + } + + // Last Result - 22.8.2023 - 6.0 ns - 0 B + [Benchmark] + public void FlatMap_Empty_ToEmpty() + { + EmptyOption.FlatMap(o => EmptyOption); + } + + // Last Result - 22.8.2023 - 5.2 ns - 0 B + [Benchmark] + public void Matching_NonEmpty() + { + NonEmptyOption.Match(_ => true, _ => false); + } + + // Last Result - 22.8.2023 - 5.3 ns - 0 B + [Benchmark] + public void Matching_Empty() + { + EmptyOption.Match(_ => true, _ => false); + } + + // Last Result - 27.8.2023 - 3.1 ns - 32 B + [Benchmark] + public void AsReadOnlyList_NonEmpty() + { + NonEmptyOption.AsReadOnlyList(); + } + + // Last Result - 27.8.2023 - 0.3 ns - 0 B + [Benchmark] + public void AsReadOnlyList_Empty() + { + EmptyOption.AsReadOnlyList(); + } // Last Result - 11.10.2023 - 1.82 ns - 0 B [Benchmark]