forked from mirror/DotRecast
165 lines
4.4 KiB
C#
165 lines
4.4 KiB
C#
using BenchmarkDotNet.Attributes;
|
|
using DotRecast.Core.Collections;
|
|
|
|
namespace CSharpBencchmark
|
|
{
|
|
/*
|
|
|
|
| Method | Count | Mean | Error | StdDev |
|
|
|---------------- |------ |--------------:|-------------:|-------------:|
|
|
| Enqueue_rcQueue | 10 | 84.19 ns | 1.328 ns | 1.242 ns |
|
|
| Enqueue_heap | 10 | 208.44 ns | 3.522 ns | 5.981 ns |
|
|
| Enqueue_pqueue | 10 | 202.59 ns | 2.320 ns | 2.170 ns |
|
|
| Enqueue_rcQueue | 100 | 791.99 ns | 15.733 ns | 43.333 ns |
|
|
| Enqueue_heap | 100 | 3,136.11 ns | 57.433 ns | 50.912 ns |
|
|
| Enqueue_pqueue | 100 | 2,256.86 ns | 19.259 ns | 17.073 ns |
|
|
| Enqueue_rcQueue | 1000 | 7,258.35 ns | 55.554 ns | 49.247 ns |
|
|
| Enqueue_heap | 1000 | 31,613.03 ns | 602.311 ns | 591.550 ns |
|
|
| Enqueue_pqueue | 1000 | 24,313.61 ns | 463.713 ns | 455.429 ns |
|
|
| Enqueue_rcQueue | 10000 | 98,246.69 ns | 1,824.495 ns | 1,706.634 ns |
|
|
| Enqueue_heap | 10000 | 356,910.42 ns | 3,376.793 ns | 2,993.439 ns |
|
|
| Enqueue_pqueue | 10000 | 278,814.15 ns | 3,733.262 ns | 3,309.439 ns |
|
|
|
|
*/
|
|
|
|
public class Bench_PriorityQueue
|
|
{
|
|
[Params(10, 100, 1000, 10000)]
|
|
public int Count;
|
|
|
|
RcSortedQueue<Node> _rcQueue;
|
|
//TBinaryHeap<Node> _heap;
|
|
PriorityQueue<Node, Node> _pqueue;
|
|
|
|
float[] _priority;
|
|
|
|
class Node
|
|
{
|
|
public int id;
|
|
public float total;
|
|
}
|
|
|
|
[GlobalSetup]
|
|
public void Setup()
|
|
{
|
|
Comparison<Node> _comparison = (x, y) =>
|
|
{
|
|
var v = x.total.CompareTo(y.total);
|
|
if (v != 0)
|
|
return v;
|
|
return x.id.CompareTo(y.id);
|
|
};
|
|
|
|
_rcQueue = new(Count, _comparison);
|
|
//_heap = new(Count, _comparison);
|
|
_pqueue = new(Count, Comparer<Node>.Create(_comparison));
|
|
|
|
_priority = new float[Count];
|
|
for (int i = 0; i < Count; i++)
|
|
{
|
|
_priority[i] = (float)Random.Shared.NextDouble() * 100f;
|
|
}
|
|
|
|
Console.WriteLine("111");
|
|
}
|
|
|
|
[Benchmark]
|
|
public void Enqueue_rcQueue()
|
|
{
|
|
_rcQueue.Clear();
|
|
for (int i = 0; i < Count; i++)
|
|
{
|
|
_rcQueue.Enqueue(new Node
|
|
{
|
|
id = i,
|
|
total = _priority[i],
|
|
});
|
|
}
|
|
}
|
|
|
|
//[Benchmark]
|
|
//public void Enqueue_heap()
|
|
//{
|
|
// _heap.Clear();
|
|
// for (int i = 0; i < Count; i++)
|
|
// {
|
|
// _heap.Push(new Node
|
|
// {
|
|
// id = i,
|
|
// total = _priority[i],
|
|
// });
|
|
// }
|
|
//}
|
|
|
|
[Benchmark]
|
|
public void Enqueue_pqueue()
|
|
{
|
|
_pqueue.Clear();
|
|
for (int i = 0; i < Count; i++)
|
|
{
|
|
var node = new Node
|
|
{
|
|
id = i,
|
|
total = _priority[i],
|
|
};
|
|
_pqueue.Enqueue(node, node);
|
|
}
|
|
}
|
|
|
|
[Benchmark]
|
|
public void EnqueueDequeue_rcQueue()
|
|
{
|
|
for (int i = 0; i < Count; i++)
|
|
{
|
|
_rcQueue.Enqueue(new Node
|
|
{
|
|
id = i,
|
|
total = _priority[i],
|
|
});
|
|
}
|
|
|
|
while (_rcQueue.Count() > 0)
|
|
{
|
|
_rcQueue.Dequeue();
|
|
}
|
|
}
|
|
|
|
//[Benchmark]
|
|
//public void EnqueueDequeue_heap()
|
|
//{
|
|
// for (int i = 0; i < Count; i++)
|
|
// {
|
|
// _heap.Push(new Node
|
|
// {
|
|
// id = i,
|
|
// total = _priority[i],
|
|
// });
|
|
// }
|
|
|
|
// while (_heap.Count > 0)
|
|
// {
|
|
// _heap.Pop();
|
|
// }
|
|
//}
|
|
|
|
[Benchmark]
|
|
public void EnqueueDequeue_pqueue()
|
|
{
|
|
for (int i = 0; i < Count; i++)
|
|
{
|
|
var node = new Node
|
|
{
|
|
id = i,
|
|
total = _priority[i],
|
|
};
|
|
_pqueue.Enqueue(node, node);
|
|
}
|
|
|
|
while (_pqueue.Count > 0)
|
|
{
|
|
_pqueue.Dequeue();
|
|
}
|
|
}
|
|
}
|
|
}
|