-
-
Notifications
You must be signed in to change notification settings - Fork 986
/
Copy pathValuesReturnedByBenchmarkTest.cs
148 lines (110 loc) · 4.63 KB
/
ValuesReturnedByBenchmarkTest.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Configs;
using BenchmarkDotNet.Environments;
using BenchmarkDotNet.Jobs;
using BenchmarkDotNet.Toolchains;
using BenchmarkDotNet.Toolchains.InProcess.Emit;
using Xunit;
using Xunit.Abstractions;
namespace BenchmarkDotNet.IntegrationTests
{
public class ValuesReturnedByBenchmarkTest : BenchmarkTestExecutor
{
public ValuesReturnedByBenchmarkTest(ITestOutputHelper output) : base(output) { }
public static IEnumerable<object[]> GetToolchains() => new[]
{
new object[] { Job.Default.GetToolchain() },
new object[] { InProcessEmitToolchain.Instance },
};
[Theory, MemberData(nameof(GetToolchains))]
public void AnyValueCanBeReturned(IToolchain toolchain) => CanExecute<ValuesReturnedByBenchmark>(ManualConfig.CreateEmpty().AddJob(Job.Dry.WithToolchain(toolchain)));
public class ValuesReturnedByBenchmark
{
#if NETFRAMEWORK
[Benchmark]
public System.Windows.Point? TypeFromCustomFrameworkAssembly() => new System.Windows.Point();
[Benchmark]
public Diagnostics.Windows.InliningDiagnoser TypeFromCustomDependency() => new Diagnostics.Windows.InliningDiagnoser();
#endif
[Benchmark]
public object ReturnNullForReferenceType() => null;
[Benchmark]
public object ReturnNotNullForReferenceType() => new object();
[Benchmark]
public DateTime? ReturnNullForNullableType() => null;
[Benchmark]
public DateTime? ReturnNotNullForNullableType() => DateTime.UtcNow;
[Benchmark]
public DateTime ReturnDefaultValueForValueType() => default;
[Benchmark]
public DateTime ReturnNonDefaultValueForValueType() => DateTime.UtcNow;
[Benchmark]
public Result<DateTime> ReturnGenericValueType() => new Result<DateTime>();
[Benchmark]
public Jit ReturnEnum() => Jit.RyuJit;
private int intergerField = 123;
[Benchmark]
public ref int ReturnByRef() => ref intergerField;
[Benchmark]
public ref readonly int ReturnByReadonlyRef() => ref intergerField;
public readonly struct ReadOnlyStruct { }
private ReadOnlyStruct readOnlyStructField;
[Benchmark]
public ReadOnlyStruct ReturnReadOnlyStruct() => new ReadOnlyStruct();
[Benchmark]
public ref ReadOnlyStruct ReturnReadOnlyStructByRef() => ref readOnlyStructField;
[Benchmark]
public ref readonly ReadOnlyStruct ReturnReadOnlyStructByReadonlyRef() => ref readOnlyStructField;
[Benchmark]
public Span<byte> ReturnStackOnlyType() => new Span<byte>(Array.Empty<byte>());
[Benchmark]
public ImmutableArray<int> TypeFromNetStandardNuGetPackage() => ImmutableArray<int>.Empty;
[Benchmark]
public ValueTuple<int> TypeInTwoDlls() => new ValueTuple<int>();
public struct Result<T>
{
public T Field;
public Result(T field)
{
Field = field;
}
}
[Benchmark]
public Job TypeCalledJob() => new Job();
public class Job { }
[Benchmark]
public NoNamespace TypeWithoutNamespace() => new NoNamespace();
[Benchmark]
public unsafe void* PointerToAnything() => System.IntPtr.Zero.ToPointer();
[Benchmark]
public unsafe int* PointerToUnmanagedType() => (int*)System.IntPtr.Zero.ToPointer();
[Benchmark]
public System.IntPtr IntPtr() => System.IntPtr.Zero;
[Benchmark]
public System.UIntPtr UIntPtr() => System.UIntPtr.Zero;
[Benchmark]
public nint NativeSizeInteger() => 0;
[Benchmark]
public nuint UnsignedNativeSizeInteger() => 0;
[Benchmark]
public Tuple<Outer, Outer.Inner> BenchmarkInnerClass() => Tuple.Create(new Outer(), new Outer.Inner());
[Benchmark]
public Tuple<Outer, Outer.InnerGeneric<string>> BenchmarkGenericInnerClass() => Tuple.Create(new Outer(), new Outer.InnerGeneric<string>());
}
public class Outer
{
public class Inner
{
}
public class InnerGeneric<T>
{
}
}
}
}
public class NoNamespace
{
}