2014-10-15 4 views
0

Я тестировал тесты, пытаясь определить лучший способ обработки многих векторных операций. Я не беспокоюсь о вычислительной эффективности, но распределении памяти, так что моя программа не получает большого успеха от сборщика мусора, который очищает лишние векторы в куче. Стандартными векторными операциями (+, *, 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# выделяет память и что делает компилятор для выделения дополнительной памяти, которая будет использоваться только в методе?

ответ

0

Оператор new не означает распределение кучи в C#. Vector2, скорее всего, является структурой, поэтому, если это локальная переменная, и вы не делаете что-то особенное, как захват ее в лямбда, она будет выделена в стеке, даже если вы используете new.

Дополнительную информацию о типах и связанных с ними хранении см. В статье great post Эрика Липперта по этому вопросу.

+0

Vector2 - это класс. Если Vector2 был структурой, это не объяснило бы, как были распределены три «новых» выше, но «новые» в перегрузках оператора не были. – dynasty1121

+0

@ dynasty1121: невозможно ответить на конкретные вопросы производительности с полным примером кода. Даже с одним, это может быть проблемой из-за различий в платформе. –

+0

@PeterDuniho, ты прав. Я вижу, что это, возможно, не было ясно из моего ответа. Я обновлю. –

Смежные вопросы