- 
          
 - 
                Notifications
    
You must be signed in to change notification settings  - Fork 1k
 
Closed as not planned
Labels
Description
Hello,
I noticed some weird results from our benchmarks when we moved our app from .net framework to .net 6.0.
Methods that should not allocate at all were reporting allocations of 8 bytes.
I've investigated and in trying to make a nice simple reproducible example I discovered that an empty method reports allocating 8 bytes
// * Summary *
BenchmarkDotNet v0.13.7, Windows 10 (10.0.19045.3208/22H2/2022Update)
12th Gen Intel Core i7-1265U, 1 CPU, 12 logical and 10 physical cores
.NET SDK 7.0.400
  [Host]     : .NET 6.0.21 (6.0.2123.36311), X64 RyuJIT AVX2
  Job-NXFHSY : .NET 6.0.21 (6.0.2123.36311), X64 RyuJIT AVX2
Runtime=.NET 6.0  InvocationCount=64  IterationCount=10
LaunchCount=1  WarmupCount=8
|      Method |   Mean |  Error | StdErr | StdDev |    Min |     Q1 | Median |     Q3 |    Max |     Op/s | Rank | Allocated |
|------------ |-------:|-------:|-------:|-------:|-------:|-------:|-------:|-------:|-------:|---------:|-----:|----------:|
| EmptyMethod | 0.0 ns | 0.0 ns | 0.0 ns | 0.0 ns | 0.0 ns | 0.0 ns | 0.0 ns | 0.0 ns | 0.0 ns | Infinity |    1 |       8 B |
I've include the very basic set up I have below
Class Library defining the benchmarks - Target framework net6.0, single class
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Configs;
using BenchmarkDotNet.Environments;
using BenchmarkDotNet.Jobs;
namespace BenchmarkTests
{
    [MemoryDiagnoser]
    [Config(typeof(Config))]
    [RankColumn]
    [AllStatisticsColumn]
    public class Benchmarks
    {
        [Benchmark]
        public void EmptyMethod()
        {
        }
        private class Config : ManualConfig
        {
            public Config()
            {
                AddJob(
                    new Job(EnvironmentMode.Default, RunMode.Short)
                    {
                        Environment = { Runtime = CoreRuntime.Core60 },
                        Run = { InvocationCount = 64, WarmupCount = 8, IterationCount = 10 }
                    });
            }
        }
    }
}
Console App that runs the benchmarks - Target framework net6.0, single class to define entry point
using BenchmarkDotNet.Running;
namespace BenchmarkTests.Runner
{
    internal class Program
    {
        static void Main(string[] args)
        { 
            BenchmarkRunner.Run<Benchmarks>();
        }
    }
}