结论:对于大量数据操作,可以使用快速数据结构替代unity原生数据结构,有效提高性能。
快速数据结构源码:GitHub - SnpM/FastCollections: Custom collections with optimizations at the cost of safety
以下仅比较Stack性能,其他同理
百万级测试结果:
千万级测试结果:
亿级测试结果:
测试代码:
public class TestStack : MonoBehaviour
{
void Start()
{
int cnt = 1000000;
Test(cnt);
ExtendTest(cnt);
cnt = 10000000;
Test(cnt);
ExtendTest(cnt);
cnt = 100000000;
Test(cnt);
ExtendTest(cnt);
}
public void Test(int cnt)
{
Debug.Log($"------------------cnt = {cnt} Create Test--------------------------");
Stopwatch stopwatch = Stopwatch.StartNew();
FastStack<int> stack1 = new FastStack<int>(cnt);
Debug.Log("fastStack = " + stopwatch.ElapsedMilliseconds);
Stopwatch stopwatch2 = Stopwatch.StartNew();
Stack stack2 = new Stack(cnt);
Debug.Log("originStack = " + stopwatch2.ElapsedMilliseconds);
Debug.Log($"------------------cnt = {cnt} Push Test --------------------------");
stopwatch.Restart();
for (int i = 0; i < cnt; i++)
{
stack1.Push(i);
}
Debug.Log("fastStack = " + stopwatch.ElapsedMilliseconds);
stopwatch2.Restart();
for (int i = 0; i < cnt; i++)
{
stack2.Push(i);
}
Debug.Log("originStack = " + stopwatch2.ElapsedMilliseconds);
Debug.Log($"------------------cnt = {cnt} Pop Test --------------------------");
stopwatch.Restart();
for (int i = 0; i < cnt; i++)
{
stack1.Pop();
}
Debug.Log("fastStack = " + stopwatch.ElapsedMilliseconds);
stopwatch2.Restart();
for (int i = 0; i < cnt; i++)
{
stack2.Pop();
}
Debug.Log("originStack = " + stopwatch2.ElapsedMilliseconds);
}
public void ExtendTest(int cnt)
{
Debug.Log($"------------------cnt = {cnt} Extend Test ------------------------");
int temp = cnt / 10;
FastStack<int> stack1 = new FastStack<int>(temp);
Stopwatch stopwatch = Stopwatch.StartNew();
for (int i = 0; i < cnt; i++)
{
stack1.Push(i);
}
Debug.Log("fastStack = " + stopwatch.ElapsedMilliseconds);
Stack stack2 = new Stack(temp);
Stopwatch stopwatch2 = Stopwatch.StartNew();
for (int i = 0; i < cnt; i++)
{
stack2.Push(i);
}
Debug.Log("originStack = " + stopwatch2.ElapsedMilliseconds);
}
}