Add comment to test case and run it through codeformatter.
authorAndy Ayers <andya@microsoft.com>
Wed, 19 Oct 2016 20:51:34 +0000 (13:51 -0700)
committerAndy Ayers <andya@microsoft.com>
Wed, 19 Oct 2016 20:51:34 +0000 (13:51 -0700)
Commit migrated from https://github.com/dotnet/coreclr/commit/6bf79f0f1edf2de19175c1275372e782916f56a2

src/coreclr/tests/src/JIT/Performance/CodeQuality/Inlining/InlineGCStruct.cs

index dee73cb..87e0f45 100644 (file)
@@ -2,6 +2,16 @@
 // The .NET Foundation licenses this file to you under the MIT license.
 // See the LICENSE file in the project root for more information.
 
+// In CoreCLR String.Format(ref, ref) is small and readily inlined.
+// The inline introduces a System.Parms GC struct local which is
+// untracked and must be zero initialized in the prolog. When the
+// inlined callsite is in a cold path, the inline hurts performance.
+//
+// There are two test methods below, one of which calls String.Format
+// on a cold path and the other which has similar structure but
+// does not call String.Format. Expectation is that they will have
+// similar performance.
+
 using Microsoft.Xunit.Performance;
 using System;
 using System.Runtime.CompilerServices;
@@ -12,110 +22,122 @@ using Xunit;
 
 public class InlineGCStruct
 {
-
 #if DEBUG
     public const int Iterations = 1;
 #else
     public const int Iterations = 2500000;
 #endif
 
-[MethodImpl(MethodImplOptions.NoInlining)]
-public static int FastFunctionNotCallingStringFormat(int param)
-{
-    if (param < 0) {
-        throw new Exception(String.Format("We do not like the value {0:N0}.", param));
-    }
-
-    if (param == int.MaxValue) {
-        throw new Exception(String.Format("{0:N0} is maxed out.", param));
-    }
+    [MethodImpl(MethodImplOptions.NoInlining)]
+    public static int FastFunctionNotCallingStringFormat(int param)
+    {
+        if (param < 0)
+        {
+            throw new Exception(String.Format("We do not like the value {0:N0}.", param));
+        }
 
-    if (param > int.MaxValue / 2) {
-        throw new Exception(String.Format("We do not like the value {0:N0} either.", param));
-    }
+        if (param == int.MaxValue)
+        {
+            throw new Exception(String.Format("{0:N0} is maxed out.", param));
+        }
 
-    return param * 2;
-}
+        if (param > int.MaxValue / 2)
+        {
+            throw new Exception(String.Format("We do not like the value {0:N0} either.", param));
+        }
 
-[MethodImpl(MethodImplOptions.NoInlining)]
-public static int FastFunctionNotHavingStringFormat(int param)
-{
-    if (param < 0) {
-        throw new ArgumentOutOfRangeException("param", "We do not like this value.");
+        return param * 2;
     }
 
-    if (param == int.MaxValue) {
-        throw new ArgumentOutOfRangeException("param", "Maxed out.");
-    }
+    [MethodImpl(MethodImplOptions.NoInlining)]
+    public static int FastFunctionNotHavingStringFormat(int param)
+    {
+        if (param < 0)
+        {
+            throw new ArgumentOutOfRangeException("param", "We do not like this value.");
+        }
 
-    if (param > int.MaxValue / 2) {
-        throw new ArgumentOutOfRangeException("param", "We do not like this value either.");
-    }
+        if (param == int.MaxValue)
+        {
+            throw new ArgumentOutOfRangeException("param", "Maxed out.");
+        }
 
-    return param * 2;
-}
+        if (param > int.MaxValue / 2)
+        {
+            throw new ArgumentOutOfRangeException("param", "We do not like this value either.");
+        }
 
-[Benchmark]
-public static bool WithFormat()
-{
-    int result = 0;
+        return param * 2;
+    }
 
-    foreach (var iteration in Benchmark.Iterations) {
-        using (iteration.StartMeasurement()) {
-            for (int i = 0; i < Iterations; i++) {
-                result |= FastFunctionNotCallingStringFormat(11);
+    [Benchmark]
+    public static bool WithFormat()
+    {
+        int result = 0;
+
+        foreach (var iteration in Benchmark.Iterations)
+        {
+            using (iteration.StartMeasurement())
+            {
+                for (int i = 0; i < Iterations; i++)
+                {
+                    result |= FastFunctionNotCallingStringFormat(11);
+                }
             }
         }
-    }
 
-    return (result == 22);
-}
-
-[Benchmark]
-public static bool WithoutFormat()
-{
-    int result = 0;
+        return (result == 22);
+    }
 
-    foreach (var iteration in Benchmark.Iterations) {
-        using (iteration.StartMeasurement()) {
-            for (int i = 0; i < Iterations; i++) {
-                result |= FastFunctionNotHavingStringFormat(11);
+    [Benchmark]
+    public static bool WithoutFormat()
+    {
+        int result = 0;
+
+        foreach (var iteration in Benchmark.Iterations)
+        {
+            using (iteration.StartMeasurement())
+            {
+                for (int i = 0; i < Iterations; i++)
+                {
+                    result |= FastFunctionNotHavingStringFormat(11);
+                }
             }
         }
+
+        return (result == 22);
     }
 
-    return (result == 22);
-}
+    public static bool WithoutFormatBase()
+    {
+        int result = 0;
 
-public static bool WithoutFormatBase()
-{
-    int result = 0;
+        for (int i = 0; i < Iterations; i++)
+        {
+            result |= FastFunctionNotHavingStringFormat(11);
+        }
 
-    for (int i = 0; i < Iterations; i++) {
-        result |= FastFunctionNotHavingStringFormat(11);
+        return (result == 22);
     }
 
-    return (result == 22);
-}
+    public static bool WithFormatBase()
+    {
+        int result = 0;
 
-public static bool WithFormatBase()
-{
-    int result = 0;
+        for (int i = 0; i < Iterations; i++)
+        {
+            result |= FastFunctionNotCallingStringFormat(11);
+        }
 
-    for (int i = 0; i < Iterations; i++) {
-        result |= FastFunctionNotCallingStringFormat(11);
+        return (result == 22);
     }
 
-    return (result == 22);
-}
-
-public static int Main()
-{
-    bool withFormat = WithFormatBase();
-    bool withoutFormat = WithoutFormatBase();
-
-    return (withFormat && withoutFormat ? 100 : -1);
-}
+    public static int Main()
+    {
+        bool withFormat = WithFormatBase();
+        bool withoutFormat = WithoutFormatBase();
 
+        return (withFormat && withoutFormat ? 100 : -1);
+    }
 }