Если я использую встроенный в массивах, которые не заполняют полностью, но вместо того, чтобы иметь максимальное значение, и использовать счетчик Int для отслеживания размера, это будет значительно быстрее, чем при использовании списков?
Да.
Я уже экспериментировал с Unity в прошлом, и это совершенно нормально для большого количества предметов, которые нужно зацикливать на каждом кадре, например на обработку изображений.
Я как-то сделал приложение, которое передает изображение HQ через сеть. Это было легко сделать с List
, но после того, как я перешел на Array
, количество кадров, полученных мной в секунду, увеличилось.Он также получил возможность распределения памяти.
Единственная нижняя сторона использования массива состоит в том, что вам необходимо выделить большой объем памяти, чтобы убедиться, что для хранения ваших предметов достаточно. Вы также должны проверить, подходит ли текущий элемент, который вы хотите разместить в массиве. Если нет, вам нужно создать новый массив большего размера, а затем скопировать старые данные в новый.
Юнить blog также имеет пост, который показывает производительность различной между использованием Array
и List
для улучшения функции Update()
. Это действительно большое увеличение производительности, а массив составляет около 5x быстрее, чем List
в этом эксперименте.
Эти правила, которые я поставил перед собой при работе Unity и еще remians, чтобы быть правдой, даже сегодня:
Если вам нужно хранить большие предметы (200к и выше), что требует вам проходное их каждый кадр, использовать массив и простое значение int, которое вы можете использовать для определения длины массива.
.Если это только детали о размере и работает только один раз в то время, а затем использовать List
.
Я изменил код this для запуска в Unity и ниже - результат.
Array/для: 6726ms (-1295415896)
Список/для: 15803ms (-1295415896)
Array/Еогеасп: 8511ms (-1295415896)
Список/Еогеасп: 42689ms (-1295415896)
Разница очень важна в Unity, в отличие от обычного приложения C#.
void Start()
{
List<int> list = new List<int>(6000000);
for (int i = 0; i < 6000000; i++)
{
list.Add(UnityEngine.Random.Range(1, 10));
}
int[] arr = list.ToArray();
int chk = 0;
Stopwatch watch = Stopwatch.StartNew();
for (int rpt = 0; rpt < 100; rpt++)
{
int len = list.Count;
for (int i = 0; i < len; i++)
{
chk += list[i];
}
}
watch.Stop();
UnityEngine.Debug.Log(String.Format("List/for: {0}ms ({1})", watch.ElapsedMilliseconds, chk));
chk = 0;
watch = Stopwatch.StartNew();
for (int rpt = 0; rpt < 100; rpt++)
{
int len = arr.Length;
for (int i = 0; i < len; i++)
{
chk += arr[i];
}
}
watch.Stop();
UnityEngine.Debug.Log(String.Format("Array/for: {0}ms ({1})", watch.ElapsedMilliseconds, chk));
chk = 0;
watch = Stopwatch.StartNew();
for (int rpt = 0; rpt < 100; rpt++)
{
foreach (int i in list)
{
chk += i;
}
}
watch.Stop();
UnityEngine.Debug.Log(String.Format("List/foreach: {0}ms ({1})", watch.ElapsedMilliseconds, chk));
chk = 0;
watch = Stopwatch.StartNew();
for (int rpt = 0; rpt < 100; rpt++)
{
foreach (int i in arr)
{
chk += i;
}
}
watch.Stop();
UnityEngine.Debug.Log(String.Format("Array/foreach: {0}ms ({1})", watch.ElapsedMilliseconds, chk));
}
Полностью зависит от того, как приложение добавляет и извлекает данные. Напишите один раз? Только для чтения? Случайный доступ? Добавить только? Случайная вставка? – MickyD
Я бы использовал встроенный массив таким же образом, что использовал бы списки, которые в настоящее время включают в себя цикл, изменяя его содержимое с добавлением и удалением элементов. –
Я хочу ответить на это, но вам нужно больше деталей. На ваш вопрос о словаре Vs List, как вы планируете использовать их? В другом случае использование имеет значение для сравнения двух. – Programmer