Skip to content

BenchmarkDotNet doesn't display null parameter correctly #2449

@DoctorKrolic

Description

@DoctorKrolic

BenchmarkDotNet version: 0.13.9

My benchmark code:

using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Running;

BenchmarkRunner.Run<NullableEqualsBenchmarks>();

public class NullableEqualsBenchmarks
{
    [Params(1, 0, null)]
    public int? Prop { get; set; }

    [Benchmark]
    public int CurrentLoweringNonDefault()
    {
        int? num = Prop;
        int num2 = 42;
        if ((num.GetValueOrDefault() == num2) & num.HasValue)
        {
            return 1;
        }

        return 0;
    }

    [Benchmark]
    public int ProposedLoweringNonDefault()
    {
        if (Prop.GetValueOrDefault() == 42)
        {
            return 1;
        }

        return 0;
    }

    [Benchmark]
    public int CurrentLoweringDefault()
    {
        int? num = Prop;
        int num2 = 0;
        if ((num.GetValueOrDefault() == num2) & num.HasValue)
        {
            return 1;
        }

        return 0;
    }

    [Benchmark]
    public int ProposedLoweringDefault()
    {
        if (Prop.GetValueOrDefault(1) == 0)
        {
            return 1;
        }

        return 0;
    }
}

Result table after run:

Method Prop Mean Error StdDev
CurrentLoweringNonDefault ? 0.4134 ns 0.0025 ns 0.0023 ns
ProposedLoweringNonDefault ? 0.2143 ns 0.0095 ns 0.0089 ns
CurrentLoweringDefault ? 0.4140 ns 0.0004 ns 0.0004 ns
ProposedLoweringDefault ? 0.2118 ns 0.0089 ns 0.0078 ns
CurrentLoweringNonDefault 0 0.4051 ns 0.0026 ns 0.0024 ns
ProposedLoweringNonDefault 0 0.2104 ns 0.0070 ns 0.0065 ns
CurrentLoweringDefault 0 0.2134 ns 0.0035 ns 0.0030 ns
ProposedLoweringDefault 0 0.0074 ns 0.0015 ns 0.0012 ns
CurrentLoweringNonDefault 1 0.4160 ns 0.0029 ns 0.0027 ns
ProposedLoweringNonDefault 1 0.2154 ns 0.0063 ns 0.0059 ns
CurrentLoweringDefault 1 0.4141 ns 0.0005 ns 0.0004 ns
ProposedLoweringDefault 1 0.2155 ns 0.0064 ns 0.0060 ns

I would expect null to be displayed in Prop column instead of meaningless ?s

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type
No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions