C# SOA против производительности ⇐ C#
C# SOA против производительности
My Clackmark пытается сравнить AOS с SOA для 1 000 000 пунктов.
< /p>
Результат для 1 000 000 пунктов:
< /p>
| Метод | Означает | Ошибка | Stddev |
| ---------------------- | ---------: | ----------: | ----------: |
| Onearraybigstruct | 8,798 мс | 0,2200 мс | 0,6278 мс |
| Многорэрсссмслянт | 6,999 мс | 0,2156 мс | 0,6221 мс |
< /pre>
Результат для 10 000 пунктов: < /p>
| Метод | Означает | Ошибка | Stddev |
| -------------------------- | ---------: | --------- | ----------: |
| Onearraybigstruct | 72,69 США | 5.161 США | 15.137 US |
| Многорэрсссмслянт | 70,20 США | 3.250 США | 9.429 US |
< /pre>
Я сомневаюсь, что SOA получит столько внимания, если он не даст не менее 2x производительности.
Что отсутствует в тесте? Имел ли SOA смысл только для старых процессоров и RAMS?using System.Numerics;
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Engines;
namespace Benchmark1;
public class BigSmallStruct
{
public const int BufferSize = 10_000;
private readonly Consumer _consumer = new();
private readonly Big[] _big = new Big[BufferSize];
private readonly Vector3[] _position01 = new Vector3[BufferSize];
private readonly Vector3[] _position02 = new Vector3[BufferSize];
private readonly Vector3[] _position03 = new Vector3[BufferSize];
private readonly Vector3[] _position04 = new Vector3[BufferSize];
private readonly Vector3[] _position05 = new Vector3[BufferSize];
private readonly Vector3[] _position06 = new Vector3[BufferSize];
private readonly Vector3[] _position07 = new Vector3[BufferSize];
private readonly Vector3[] _position08 = new Vector3[BufferSize];
private readonly Vector3[] _position09 = new Vector3[BufferSize];
private readonly Vector3[] _position10 = new Vector3[BufferSize];
private readonly Vector3[] _position11 = new Vector3[BufferSize];
private readonly Vector3[] _position12 = new Vector3[BufferSize];
private readonly int[] _blob = new int[1000 * 1000 * 1000];
[GlobalSetup]
public void Setup()
{
for (var i = 0; i < BufferSize; i++)
{
_big = new Big
{
Position01 = new Vector3(i, i, 1),
Position02 = new Vector3(i, i, 2),
Position03 = new Vector3(i, i, 3),
Position04 = new Vector3(i, i, 4),
Position05 = new Vector3(i, i, 5),
Position06 = new Vector3(i, i, 6),
Position07 = new Vector3(i, i, 7),
Position08 = new Vector3(i, i, 8),
Position09 = new Vector3(i, i, 9),
Position10 = new Vector3(i, i, 10),
Position11 = new Vector3(i, i, 11),
Position12 = new Vector3(i, i, 12)
};
_position01 = _big.Position01;
_position02 = _big.Position02;
_position03 = _big.Position03;
_position04 = _big.Position04;
_position05 = _big[i].Position05;
_position06[i] = _big[i].Position06;
_position07[i] = _big[i].Position07;
_position08[i] = _big[i].Position08;
_position09[i] = _big[i].Position09;
_position10[i] = _big[i].Position10;
_position11[i] = _big[i].Position11;
_position12[i] = _big[i].Position12;
}
for (var i = 0; i < _blob.Length; i++)
{
_blob[i] = i + 1;
}
}
[Benchmark]
public void OneArrayBigStruct()
{
var result = new Vector3(0f, 0f, 0f);
for (var i = 0; i < BufferSize; i++)
{
result += _big[i].Position01;
result += _big[i].Position05;
}
_consumer.Consume(result);
}
[Benchmark]
public void ManyArraysSmallStruct()
{
var result = new Vector3(0f, 0f, 0f);
for (var i = 0; i < BufferSize; i++)
{
result += _position01[i];
result += _position05[i];
}
_consumer.Consume(result);
}
}
public struct Big
{
public Vector3 Position01;
public Vector3 Position02;
public Vector3 Position03;
public Vector3 Position04;
public Vector3 Position05;
public Vector3 Position06;
public Vector3 Position07;
public Vector3 Position08;
public Vector3 Position09;
public Vector3 Position10;
public Vector3 Position11;
public Vector3 Position12;
}
Подробнее здесь: https://stackoverflow.com/questions/796 ... erformance
My Clackmark пытается сравнить AOS с SOA для 1 000 000 пунктов.
< /p>
Результат для 1 000 000 пунктов:
< /p>
| Метод | Означает | Ошибка | Stddev |
| ---------------------- | ---------: | ----------: | ----------: |
| Onearraybigstruct | 8,798 мс | 0,2200 мс | 0,6278 мс |
| Многорэрсссмслянт | 6,999 мс | 0,2156 мс | 0,6221 мс |
< /pre>
Результат для 10 000 пунктов: < /p>
| Метод | Означает | Ошибка | Stddev |
| -------------------------- | ---------: | --------- | ----------: |
| Onearraybigstruct | 72,69 США | 5.161 США | 15.137 US |
| Многорэрсссмслянт | 70,20 США | 3.250 США | 9.429 US |
< /pre>
Я сомневаюсь, что SOA получит столько внимания, если он не даст не менее 2x производительности.
Что отсутствует в тесте? Имел ли SOA смысл только для старых процессоров и RAMS?using System.Numerics;
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Engines;
namespace Benchmark1;
public class BigSmallStruct
{
public const int BufferSize = 10_000;
private readonly Consumer _consumer = new();
private readonly Big[] _big = new Big[BufferSize];
private readonly Vector3[] _position01 = new Vector3[BufferSize];
private readonly Vector3[] _position02 = new Vector3[BufferSize];
private readonly Vector3[] _position03 = new Vector3[BufferSize];
private readonly Vector3[] _position04 = new Vector3[BufferSize];
private readonly Vector3[] _position05 = new Vector3[BufferSize];
private readonly Vector3[] _position06 = new Vector3[BufferSize];
private readonly Vector3[] _position07 = new Vector3[BufferSize];
private readonly Vector3[] _position08 = new Vector3[BufferSize];
private readonly Vector3[] _position09 = new Vector3[BufferSize];
private readonly Vector3[] _position10 = new Vector3[BufferSize];
private readonly Vector3[] _position11 = new Vector3[BufferSize];
private readonly Vector3[] _position12 = new Vector3[BufferSize];
private readonly int[] _blob = new int[1000 * 1000 * 1000];
[GlobalSetup]
public void Setup()
{
for (var i = 0; i < BufferSize; i++)
{
_big = new Big
{
Position01 = new Vector3(i, i, 1),
Position02 = new Vector3(i, i, 2),
Position03 = new Vector3(i, i, 3),
Position04 = new Vector3(i, i, 4),
Position05 = new Vector3(i, i, 5),
Position06 = new Vector3(i, i, 6),
Position07 = new Vector3(i, i, 7),
Position08 = new Vector3(i, i, 8),
Position09 = new Vector3(i, i, 9),
Position10 = new Vector3(i, i, 10),
Position11 = new Vector3(i, i, 11),
Position12 = new Vector3(i, i, 12)
};
_position01 = _big.Position01;
_position02 = _big.Position02;
_position03 = _big.Position03;
_position04 = _big.Position04;
_position05 = _big[i].Position05;
_position06[i] = _big[i].Position06;
_position07[i] = _big[i].Position07;
_position08[i] = _big[i].Position08;
_position09[i] = _big[i].Position09;
_position10[i] = _big[i].Position10;
_position11[i] = _big[i].Position11;
_position12[i] = _big[i].Position12;
}
for (var i = 0; i < _blob.Length; i++)
{
_blob[i] = i + 1;
}
}
[Benchmark]
public void OneArrayBigStruct()
{
var result = new Vector3(0f, 0f, 0f);
for (var i = 0; i < BufferSize; i++)
{
result += _big[i].Position01;
result += _big[i].Position05;
}
_consumer.Consume(result);
}
[Benchmark]
public void ManyArraysSmallStruct()
{
var result = new Vector3(0f, 0f, 0f);
for (var i = 0; i < BufferSize; i++)
{
result += _position01[i];
result += _position05[i];
}
_consumer.Consume(result);
}
}
public struct Big
{
public Vector3 Position01;
public Vector3 Position02;
public Vector3 Position03;
public Vector3 Position04;
public Vector3 Position05;
public Vector3 Position06;
public Vector3 Position07;
public Vector3 Position08;
public Vector3 Position09;
public Vector3 Position10;
public Vector3 Position11;
public Vector3 Position12;
}
Подробнее здесь: https://stackoverflow.com/questions/796 ... erformance
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение