Skip to content

Commit fe97ebe

Browse files
author
Vyacheslav
committed
feat: resolve #18
1 parent 4329ccc commit fe97ebe

File tree

10 files changed

+426
-28
lines changed

10 files changed

+426
-28
lines changed

Src/Benchmarks/Model/JobClass.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ namespace Benchmark
44
{
55
[GenerateHelper]
66
[GenerateStack]
7+
[GenerateQueue]
78
[GenerateWrapper]
89
public class JobClass
910
{
@@ -29,6 +30,7 @@ long int64
2930

3031
[GenerateHelper]
3132
[GenerateStack]
33+
[GenerateQueue]
3234
[GenerateWrapper]
3335
public class JobClass2
3436
{

Src/Benchmarks/Model/JobStruct.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ namespace Benchmark
44
{
55
[GenerateHelper]
66
[GenerateStack]
7+
[GenerateQueue]
78
[GenerateWrapper]
89
public struct JobStruct
910
{
@@ -24,6 +25,7 @@ long int64
2425

2526
[GenerateHelper]
2627
[GenerateStack]
28+
[GenerateQueue]
2729
[GenerateWrapper]
2830
public struct JobStruct2
2931
{

Src/Benchmarks/Program.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,12 @@ static void Main(string[] args)
1010
BenchmarkRunner.Run<Queue.PrimitiveSimpleJob>();// 4 byte * Size
1111
BenchmarkRunner.Run<Queue.PrimitiveOptimalJob>();// 4 byte * Size
1212

13+
BenchmarkRunner.Run<Queue.StructSimpleJob>();// 24 byte * Size
14+
BenchmarkRunner.Run<Queue.StructOptimalJob>();// 24 byte * Size
15+
16+
BenchmarkRunner.Run<Queue.ClassSimpleJob>();// 24 byte * Size
17+
BenchmarkRunner.Run<Queue.ClassOptimalJob>();// 24 byte * Size
18+
1319
//Stack
1420
BenchmarkRunner.Run<Stack.PrimitiveSimpleJob>();// 4 byte * Size
1521
BenchmarkRunner.Run<Stack.PrimitiveOptimalJob>();// 4 byte * Size
Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
using BenchmarkDotNet.Attributes;
2+
using BenchmarkDotNet.Jobs;
3+
4+
namespace Benchmark.Queue
5+
{
6+
[MemoryDiagnoser]
7+
[SimpleJob(RuntimeMoniker.Net60)]
8+
[HideColumns("Error", "StdDev", "Median", "Gen0", "Gen1", "Gen2", "Alloc Ratio", "RatioSD")]
9+
public class ClassOptimalJob
10+
{
11+
[Params(100, 1000, 10000, 100000, 250000, 500000, 1000000)]
12+
public int Size;
13+
14+
[Benchmark(Description = $"StackMemoryCollections")]
15+
public void StackMemory()
16+
{
17+
unsafe
18+
{
19+
using (var memory = new StackMemoryCollections.Struct.StackMemory(JobClassHelper.SizeOf * (nuint)Size))
20+
{
21+
var item = new Benchmark.Struct.JobClassWrapper(memory.Start, false);
22+
var js2W = new Benchmark.Struct.JobClass2Wrapper(memory.Start, false);
23+
for (int j = 0; j < 100; j++)
24+
{
25+
{
26+
using var queue = new Benchmark.Struct.QueueOfJobClass((nuint)Size, &memory);
27+
for (int i = 0; i < Size; i++)
28+
{
29+
item.ChangePtr(queue.BackFuture());
30+
item.SetInt32(in i);
31+
item.SetInt64(i * 2);
32+
js2W.ChangePtr(item.JobClass2Ptr);
33+
js2W.SetInt32(i + 3);
34+
js2W.SetInt64(i * 3);
35+
queue.PushFuture();
36+
}
37+
38+
if(j > 50)
39+
{
40+
queue.Clear();
41+
}
42+
else
43+
{
44+
while (queue.TryPop())
45+
{
46+
}
47+
}
48+
}
49+
50+
using var queue2 = new Benchmark.Struct.QueueOfJobClass((nuint)Size, &memory);
51+
for (int i = 0; i < Size; i++)
52+
{
53+
item.ChangePtr(queue2.BackFuture());
54+
item.SetInt32(in i);
55+
item.SetInt64(i * 2);
56+
js2W.ChangePtr(item.JobClass2Ptr);
57+
js2W.SetInt32(i + 3);
58+
js2W.SetInt64(i * 3);
59+
queue2.PushFuture();
60+
}
61+
62+
if (j > 50)
63+
{
64+
queue2.Clear();
65+
}
66+
else
67+
{
68+
while (queue2.TryPop())
69+
{
70+
}
71+
}
72+
}
73+
}
74+
}
75+
}
76+
77+
[Benchmark(Baseline = true, Description = "System.Collections.Generic")]
78+
public void SystemCollectionsStack()
79+
{
80+
unsafe
81+
{
82+
for (int j = 0; j < 100; j++)
83+
{
84+
{
85+
var queue = new System.Collections.Generic.Queue<JobClass>(Size);
86+
for (int i = 0; i < Size; i++)
87+
{
88+
queue.Enqueue(
89+
new JobClass(i, i * 2)
90+
{
91+
JobClass2 = new JobClass2(i + 3, i * 3)
92+
}
93+
);
94+
}
95+
96+
if (j > 50)
97+
{
98+
queue.Clear();
99+
}
100+
else
101+
{
102+
while (queue.TryDequeue(out _))
103+
{
104+
}
105+
}
106+
}
107+
108+
var queue2 = new System.Collections.Generic.Queue<JobClass>(Size);
109+
for (int i = 0; i < Size; i++)
110+
{
111+
queue2.Enqueue(
112+
new JobClass(i, i * 2)
113+
{
114+
JobClass2 = new JobClass2(i + 3, i * 3)
115+
}
116+
);
117+
}
118+
119+
if (j > 50)
120+
{
121+
queue2.Clear();
122+
}
123+
else
124+
{
125+
while (queue2.TryDequeue(out _))
126+
{
127+
}
128+
}
129+
}
130+
}
131+
}
132+
}
133+
}

Src/Benchmarks/Queue/Optimal/PrimitiveOptimalJob.cs

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -21,39 +21,39 @@ public void StackMemory()
2121
for (int j = 0; j < 100; j++)
2222
{
2323
{
24-
using var stack = new StackMemoryCollections.Struct.QueueOfInt32((nuint)Size, &memory);
24+
using var queue = new StackMemoryCollections.Struct.QueueOfInt32((nuint)Size, &memory);
2525
for (int i = 0; i < Size; i++)
2626
{
27-
*stack.BackFuture() = i;
28-
stack.PushFuture();
27+
*queue.BackFuture() = i;
28+
queue.PushFuture();
2929
}
3030

3131
if(j > 50)
3232
{
33-
stack.Clear();
33+
queue.Clear();
3434
}
3535
else
3636
{
37-
while (stack.TryPop())
37+
while (queue.TryPop())
3838
{
3939
}
4040
}
4141
}
4242

43-
using var stack2 = new StackMemoryCollections.Struct.QueueOfInt32((nuint)Size, &memory);
43+
using var queue2 = new StackMemoryCollections.Struct.QueueOfInt32((nuint)Size, &memory);
4444
for (int i = 0; i < Size; i++)
4545
{
46-
*stack2.BackFuture() = i;
47-
stack2.PushFuture();
46+
*queue2.BackFuture() = i;
47+
queue2.PushFuture();
4848
}
4949

5050
if (j > 50)
5151
{
52-
stack2.Clear();
52+
queue2.Clear();
5353
}
5454
else
5555
{
56-
while (stack2.TryPop())
56+
while (queue2.TryPop())
5757
{
5858
}
5959
}
@@ -70,37 +70,37 @@ public void SystemCollectionsStack()
7070
for (int j = 0; j < 100; j++)
7171
{
7272
{
73-
var stack = new System.Collections.Generic.Queue<int>(Size);
73+
var queue = new System.Collections.Generic.Queue<int>(Size);
7474
for (int i = 0; i < Size; i++)
7575
{
76-
stack.Enqueue(i);
76+
queue.Enqueue(i);
7777
}
7878

7979
if (j > 50)
8080
{
81-
stack.Clear();
81+
queue.Clear();
8282
}
8383
else
8484
{
85-
while (stack.TryDequeue(out _))
85+
while (queue.TryDequeue(out _))
8686
{
8787
}
8888
}
8989
}
9090

91-
var stack2 = new System.Collections.Generic.Queue<int>(Size);
91+
var queue2 = new System.Collections.Generic.Queue<int>(Size);
9292
for (int i = 0; i < Size; i++)
9393
{
94-
stack2.Enqueue(i);
94+
queue2.Enqueue(i);
9595
}
9696

9797
if (j > 50)
9898
{
99-
stack2.Clear();
99+
queue2.Clear();
100100
}
101101
else
102102
{
103-
while (stack2.TryDequeue(out _))
103+
while (queue2.TryDequeue(out _))
104104
{
105105
}
106106
}

0 commit comments

Comments
 (0)