controlflow / resharper-heapview

ReSharper Heap Allocations Viewer plugin
MIT License
303 stars 28 forks source link

Enum.HasFlag incorrectly marked as allocating in newer versions of .NET #97

Closed benbryant0 closed 1 year ago

benbryant0 commented 2 years ago

Calls to Enum.HasFlag are being marked as causing boxing allocations in my .NET 6 project, but this isn't true since at least .NET Core 3.1:

[MemoryDiagnoser]
[SimpleJob(RuntimeMoniker.Net48)]
[SimpleJob(RuntimeMoniker.NetCoreApp31)]
public class EnumBench {
    [Flags]
    private enum A {
        One,
        Two,
    }

    [Benchmark]
    public void HasFlag() {
        var val = A.One;
        for (var i = 0; i < 1_000_000; i++) {
            _ = val.HasFlag(A.Two);
        }
    }
}

Gives the result:

|  Method |                Job |            Runtime |        Mean |     Error |    StdDev |     Gen 0 |    Allocated |
|-------- |------------------- |------------------- |------------:|----------:|----------:|----------:|-------------:|
| HasFlag |      .NET Core 3.1 |      .NET Core 3.1 |    220.7 us |   1.08 us |   1.01 us |         - |            - |
| HasFlag | .NET Framework 4.8 | .NET Framework 4.8 | 16,083.7 us | 224.69 us | 210.18 us | 7625.0000 | 48,141,422 B |
controlflow commented 1 year ago

Thanks for reporting this, fixed 👍