public IComponent[] Components;
public interface IComponent {}
public class Position : IComponent {
public static Vector3 operator -(Vector3 c, Vector3 c2)
Vector3 te = new Vector3() { x = c.x - c2.x, y = c.y - c2.y, z = c.z - c2.z };
static void Setup(out Entity[] entities, out Vector3 translateDistance, out double distanceFromOrigin) {
entities = new Entity[entityCount];
translateDistance = new Vector3() { x = 1000, y = 1000, z = 1000 };
distanceFromOrigin = Math.Sqrt((translateDistance.x * translateDistance.x + translateDistance.y * translateDistance.y + translateDistance.z * translateDistance.z));
Random rand = new Random();
for(int i = 0; i < entityCount; i++) {
Vector3 pos = new Vector3() { x = rand.NextDouble() * 6000 - 3000, y = rand.NextDouble() * 6000 - 3000, z = rand.NextDouble() * 6000 - 3000 };
entities[i] = new Entity() {
Components = new IComponent[] { new Position() { Value = pos } }
const int entityCount = 10000;
public static void Main()
Vector3 translateDistance;
double distanceFromOrigin;
double MaxDistance = 1024;
Setup(out entities, out translateDistance, out distanceFromOrigin);
var watch = new System.Diagnostics.Stopwatch();
if (distanceFromOrigin > MaxDistance) {
foreach (var entity in entities) {
Vector3 newPosition = ((Position) entity.Components[0]).Value - translateDistance;
entity.Components[0] = new Position() { Value = newPosition };
translateDistance = new Vector3() { x=0,y=0,z=0 };
Console.WriteLine($"Execution Time (method 1): {watch.ElapsedTicks / 10000f} ms");
Setup(out entities, out translateDistance, out distanceFromOrigin);
if (distanceFromOrigin > MaxDistance) {
Position[] positions = new Position[entityCount];
foreach (var entity in entities) {
Vector3 newPosition = ((Position) entity.Components[0]).Value - translateDistance;
positions[i++] = new Position() { Value = newPosition };
foreach (var entity in entities) {
entity.Components[0] = positions[i];
translateDistance = new Vector3() { x=0,y=0,z=0 };
Console.WriteLine($"Execution Time (method 2): {watch.ElapsedTicks / 10000f} ms");