Я тестировал тесты, пытаясь определить лучший способ обработки многих векторных операций. Я не беспокоюсь о вычислительной эффективности, но распределении памяти, так что моя программа не получает большого успеха от сборщика мусора, который очищает лишние векторы в куче. Стандартными векторными операциями (+, *, normalize) являются статические перегрузки операторов, которые берут в два вектора и возвращают новый вектор. Поскольку они используют новый оператор, я думал, что он выделит память в куче и установит назначающую переменную эту ячейку памяти. Это было связано с моей первоначальной гипотезой использования методов, которые обновили бы существующий вектор, если бы этот вектор был назначающей переменной.C# Распределение памяти в отношении операторов памяти
Это стандартный код, который использует операции с вектором.
var object1Pos = new Vector2(10, 5);
var object2Pos = new Vector2(-5, 3);
Vector2 object1Trajectory = (object2Pos - object1Pos).normalized;
object1Trajectory *= 8;
object1Pos += object1Trajectory;
Это код, который использует методы для обновления вектора.
var object1Pos = new Vector2(10, 5);
var object2Pos = new Vector2(-5, 3);
var object1Trajectory = new Vector2(object2Pos);
object1Trajectory.Add(object1Pos * -1);
object1Trajectory.Normalize();
object1Trajectory.Scale(8);
object1Pos.Add(object1Trajectory);
Запуск эталонный тест, в то время как код метода составляет 35% эффективнее, чем код оператора (хотя это увеличение не то, что значительная) сумма, выделенная в кучу и очищается от сборщика мусора было то же самое , Это не имеет смысла для меня, поскольку это показывает, что либо векторы, генерируемые операторами, генерируются в стеке, либо компилятор делает некоторые оптимизации, поэтому ему не нужно выделять новую память в кучу. Я хотел бы знать, как C# выделяет память и что делает компилятор для выделения дополнительной памяти, которая будет использоваться только в методе?
Vector2 - это класс. Если Vector2 был структурой, это не объяснило бы, как были распределены три «новых» выше, но «новые» в перегрузках оператора не были. – dynasty1121
@ dynasty1121: невозможно ответить на конкретные вопросы производительности с полным примером кода. Даже с одним, это может быть проблемой из-за различий в платформе. –
@PeterDuniho, ты прав. Я вижу, что это, возможно, не было ясно из моего ответа. Я обновлю. –