Производительность создания структурных значений - PullRequest
6 голосов
/ 13 февраля 2012

Я сейчас читаю Oreilly's Learning XNA 4.0 , и я заметил, что автор склонен к созданию значения структуры, такого как Vector2 или Rectangle, несколько раз, без учета производительности .

Например, метод SquareCollision(), который проверяет столкновение между двумя игровыми объектами, создает два Rectangle s каждый раз, когда он вызывается, вместо того, чтобы просто каждый игровой объект занимал свое собственное поле Rectangle и сравнивал поля без создания каких-либо структурных значений.

Я видел эту модель много раз во многих местах, и это заставило меня задуматься:
Является ли создание значений структуры незначительным в C #?
Действительно ли это относится к разделу микрооптимизации?

Возможно, поскольку мой опыт в основном связан с Java, концепция ValueType s мне странна, но кажется, что воссоздание значения из структуры (и вызов его конструктора) несколько раз кажется гигантской тратой ресурсов.

Ответы [ 3 ]

6 голосов
/ 13 февраля 2012

Создание структуры для краткого использования в стеке очень дешево и мало чем отличается от простого задания локальных переменных для всех этих значений, но с компонентизацией. Однако как часть объекта это будет дополнительный дубликат тех же данных для каждого объекта.

Оба подхода действительны, в зависимости от сценария. В стеке, однако, нет реальной стоимости ресурсов. Как часть объекта, вы должны убедиться, что вы не дублируете данные без необходимости, поскольку это будет иметь реальную стоимость.

Если бы это было свойство объекта, вам бы пришлось скопировать его много раз.

Если бы это было поле на объекте, то да: его можно было бы использовать на месте, даже не копируя, но: в большинстве случаев это относительно мало.

Как всегда, вам нужно зарегистрироваться, чтобы знать, имеет ли это значение.

1 голос
/ 13 февраля 2012

То, что эта структура внутри вашего (скажем) Mesh объекта не принесет вам никакой пользы.Потому что в момент запроса к нему значение структуры будет скопировано .Рассмотрим пример:

public class Mesh 
{
  public Vector3 MeshCogVector {get;set};
}

и где-то в коде, который у вас есть

public void CollisionDetection
{
    for(int i=0;....)
    {
       Mesh curmesh = listofmashes[i];
       Vector3 vec3 = curmesh.MeshCogVector; //value copied

    }
}

Поэтому, используя таким образом в своих условиях, вы в основном не получаете никакой выгоды + вы увеличиваете свой Mesh размер экземпляра.

Вместо того чтобы использовать / конструировать этот Vector3 экземпляр внутри фактического метода, в тот момент, когда он вам действительно нужен, вы получаете быстрое распределение стека и быструю сборку мусора.

Если вы не удовлетворены производительностью в структурах, можете рассмотреть возможность использования non safe массивов данных.Но это то, что вы должны измерить, чтобы понять, подходит ли вам этот сценарий.

0 голосов
/ 08 ноября 2018

Все атрибуты, присутствующие в структуре, присутствуют в памяти как непрерывное выделение памяти, что означает, что все атрибуты присутствуют бок о бок, поэтому доступ к каждому атрибуту, структурам, упрощает работу ЦП. Где как Следующие основные концепции OPP могут снизить производительность, например, В классе, если у вас есть переменная Power и из другого скрипта, если вы ссылаетесь на это значение, то CPU ссылается на все местоположения атрибутов, присутствующих в этом классе (так как все данные присутствуют в куче в случайном месте, поэтому для CPU требуется больше работы), вызывается как строковое кеширование.

Решение

[System.Serializeable]
public Struct SomeclassData(){  

Vector3 vec;
float value;
// some numeric data or vector data  }


public class SomeClass : Monobehaviour{
SomeclassData data;

void Start(){
 data = new SomeClassData();
}

}
...