From 02ecbd89275288a1ccc3c4a4c229695b4e1b8164 Mon Sep 17 00:00:00 2001 From: Fadi Hanna Date: Thu, 29 Aug 2019 10:16:16 -0700 Subject: [PATCH 1/3] Add new perf benchmark for generic dictionary expansion --- .../coreclr/perflab/DictinoaryExpansion.cs | 158 ++++++++++++++++++ 1 file changed, 158 insertions(+) create mode 100644 src/benchmarks/micro/coreclr/perflab/DictinoaryExpansion.cs diff --git a/src/benchmarks/micro/coreclr/perflab/DictinoaryExpansion.cs b/src/benchmarks/micro/coreclr/perflab/DictinoaryExpansion.cs new file mode 100644 index 00000000000..c24d636ca40 --- /dev/null +++ b/src/benchmarks/micro/coreclr/perflab/DictinoaryExpansion.cs @@ -0,0 +1,158 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Runtime.CompilerServices; +using System.Collections.Generic; +using BenchmarkDotNet.Attributes; +using MicroBenchmarks; + +namespace PerfLabTests +{ + public class GenClass + { + [MethodImpl(MethodImplOptions.NoInlining)] + public Type FuncOnGenClass(int level) + { + switch (level) + { + case 0: return typeof(T); + case 1: return typeof(List); + case 2: return typeof(List>); + case 3: return typeof(List>>); + case 4: return typeof(List>>>); + case 5: return typeof(List>>>>); + case 6: return typeof(List>>>>>); + case 7: return typeof(List>>>>>>); + case 8: return typeof(List>>>>>>>); + case 9: return typeof(List>>>>>>>>); + case 10: return typeof(List>>>>>>>>>); + case 11: return typeof(List>>>>>>>>>>); + case 12: return typeof(List>>>>>>>>>>>); + default: return typeof(List>>>>>>>>>>>>); + } + } + + [MethodImpl(MethodImplOptions.NoInlining)] + public Type FuncOnGenClass2(int level) + { + switch (level) + { + case 0: return typeof(T); + case 1: return typeof(List); + case 2: return typeof(List>); + case 3: return typeof(List>>); + case 4: return typeof(List>>>); + case 5: return typeof(List>>>>); + case 6: return typeof(List>>>>>); + case 7: return typeof(List>>>>>>); + case 8: return typeof(List>>>>>>>); + case 9: return typeof(List>>>>>>>>); + case 10: return typeof(List>>>>>>>>>); + case 11: return typeof(List>>>>>>>>>>); + case 12: return typeof(List>>>>>>>>>>>); + default: return typeof(List>>>>>>>>>>>>); + } + } + + [MethodImpl(MethodImplOptions.NoInlining)] + public static void FuncOnGenClassTest() + { + var o1 = new GenClass(); + var o2 = new GenClass(); + var o3 = new GenClass(); + + for (int j = 0; j < DictionaryExpansion.s_Iterations; j++) + { + for (int i = 0; i < 15; i++) + o1.FuncOnGenClass(i); + + for (int i = 0; i < 15; i++) + o2.FuncOnGenClass(i); + + for (int i = 0; i < 15; i++) + o2.FuncOnGenClass2(i); + + for (int i = 0; i < 15; i++) + o3.FuncOnGenClass(i); + } + } + } + + [BenchmarkCategory(Categories.CoreCLR, Categories.Perflab)] + public class DictionaryExpansion + { + [MethodImpl(MethodImplOptions.NoInlining)] + public static Type GenFunc(int level) + { + switch (level) + { + case 0: return typeof(T); + case 1: return typeof(List); + case 2: return typeof(List>); + case 3: return typeof(List>>); + case 4: return typeof(List>>>); + case 5: return typeof(List>>>>); + case 6: return typeof(List>>>>>); + case 7: return typeof(List>>>>>>); + case 8: return typeof(List>>>>>>>); + case 9: return typeof(List>>>>>>>>); + case 10: return typeof(List>>>>>>>>>); + case 11: return typeof(List>>>>>>>>>>); + case 12: return typeof(List>>>>>>>>>>>); + default: return typeof(List>>>>>>>>>>>>); + } + } + + [MethodImpl(MethodImplOptions.NoInlining)] + public static Type GenFunc2(int level) + { + switch (level) + { + case 0: return typeof(T); + case 1: return typeof(List); + case 2: return typeof(List>); + case 3: return typeof(List>>); + case 4: return typeof(List>>>); + case 5: return typeof(List>>>>); + case 6: return typeof(List>>>>>); + case 7: return typeof(List>>>>>>); + case 8: return typeof(List>>>>>>>); + case 9: return typeof(List>>>>>>>>); + case 10: return typeof(List>>>>>>>>>); + case 11: return typeof(List>>>>>>>>>>); + case 12: return typeof(List>>>>>>>>>>>); + default: return typeof(List>>>>>>>>>>>>); + } + } + + [MethodImpl(MethodImplOptions.NoInlining)] + public static void GenFuncTest() + { + for (int j = 0; j < s_Iterations; j++) + { + for (int i = 0; i < 15; i++) + GenFunc(i); + + for (int i = 0; i < 15; i++) + GenFunc(i); + + for (int i = 0; i < 15; i++) + GenFunc2(i); + + for (int i = 0; i < 15; i++) + GenFunc(i); + } + } + + public static int s_Iterations = 100000; + + [Benchmark] + public void ExpandDictionaries() + { + GenClass.FuncOnGenClassTest(); + + GenFuncTest(); + } + } +} From a63bcc34560f091f9dfc26d5cc27b58f320e8f56 Mon Sep 17 00:00:00 2001 From: Fadi Hanna Date: Thu, 7 Nov 2019 11:57:02 -0800 Subject: [PATCH 2/3] CR feedback --- ...aryExpansion.cs => DictionaryExpansion.cs} | 42 +++++++++---------- 1 file changed, 20 insertions(+), 22 deletions(-) rename src/benchmarks/micro/coreclr/perflab/{DictinoaryExpansion.cs => DictionaryExpansion.cs} (87%) diff --git a/src/benchmarks/micro/coreclr/perflab/DictinoaryExpansion.cs b/src/benchmarks/micro/coreclr/perflab/DictionaryExpansion.cs similarity index 87% rename from src/benchmarks/micro/coreclr/perflab/DictinoaryExpansion.cs rename to src/benchmarks/micro/coreclr/perflab/DictionaryExpansion.cs index c24d636ca40..79bf5126610 100644 --- a/src/benchmarks/micro/coreclr/perflab/DictinoaryExpansion.cs +++ b/src/benchmarks/micro/coreclr/perflab/DictionaryExpansion.cs @@ -62,20 +62,17 @@ public static void FuncOnGenClassTest() var o2 = new GenClass(); var o3 = new GenClass(); - for (int j = 0; j < DictionaryExpansion.s_Iterations; j++) - { - for (int i = 0; i < 15; i++) - o1.FuncOnGenClass(i); + for (int i = 0; i < 15; i++) + o1.FuncOnGenClass(i); - for (int i = 0; i < 15; i++) - o2.FuncOnGenClass(i); + for (int i = 0; i < 15; i++) + o2.FuncOnGenClass(i); - for (int i = 0; i < 15; i++) - o2.FuncOnGenClass2(i); + for (int i = 0; i < 15; i++) + o2.FuncOnGenClass2(i); - for (int i = 0; i < 15; i++) - o3.FuncOnGenClass(i); - } + for (int i = 0; i < 15; i++) + o3.FuncOnGenClass(i); } } @@ -129,24 +126,25 @@ public static Type GenFunc2(int level) [MethodImpl(MethodImplOptions.NoInlining)] public static void GenFuncTest() { - for (int j = 0; j < s_Iterations; j++) - { - for (int i = 0; i < 15; i++) - GenFunc(i); + for (int i = 0; i < 15; i++) + GenFunc(i); - for (int i = 0; i < 15; i++) - GenFunc(i); + for (int i = 0; i < 15; i++) + GenFunc(i); - for (int i = 0; i < 15; i++) - GenFunc2(i); + for (int i = 0; i < 15; i++) + GenFunc2(i); - for (int i = 0; i < 15; i++) - GenFunc(i); - } + for (int i = 0; i < 15; i++) + GenFunc(i); } public static int s_Iterations = 100000; + + // + // This benchmark is used to measure the performance of generic dictionary lookups. + // [Benchmark] public void ExpandDictionaries() { From 87ad39a2185beb54c6a5e57afeb11b2f59256022 Mon Sep 17 00:00:00 2001 From: Fadi Hanna Date: Thu, 7 Nov 2019 11:58:40 -0800 Subject: [PATCH 3/3] Remove unused iteration counter --- src/benchmarks/micro/coreclr/perflab/DictionaryExpansion.cs | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/benchmarks/micro/coreclr/perflab/DictionaryExpansion.cs b/src/benchmarks/micro/coreclr/perflab/DictionaryExpansion.cs index 79bf5126610..11455f50b96 100644 --- a/src/benchmarks/micro/coreclr/perflab/DictionaryExpansion.cs +++ b/src/benchmarks/micro/coreclr/perflab/DictionaryExpansion.cs @@ -139,9 +139,6 @@ public static void GenFuncTest() GenFunc(i); } - public static int s_Iterations = 100000; - - // // This benchmark is used to measure the performance of generic dictionary lookups. //