C# - List.ToArray(), принимая несколько мс для одного элемента
У меня есть следующий код и по какой-то причине метод ToArray() занимает 7 мс для одного элемента. В приложении есть несколько рабочих потоков, в которых это происходит, и я также профилировал приложение с помощью JetBrains dotTrace, которая показывает, что поток ожидает другого в это время (а не просто ожидает ЦП), что, очевидно, не должно быть возможным, поскольку Список является локальной переменной, и я не использую блокировки.
List<TransactionType> transactionTypes =
new List<TransactionType>(_TransactionTypes.LengthNull() +
drawingAction._TransactionTypes.LengthNull())
...
Stopwatch sw = Stopwatch.StartNew();
_TransactionTypes = transactionTypes.ToArray();
sw.Stop();
if (sw.ElapsedMilliseconds > 3)
{
int deb = 0;
}
Это явление встречается практически во всех точках, где используются методы.Net Framework (например, String.Format). У меня была эта проблема некоторое время, и по какой-то причине использование SpinWait в основном потоке усугубляет ситуацию.
Ни у меня, ни у моих коллег нет объяснения этому, и Google тоже не помог, поэтому я был бы очень благодарен за помощь.
Нашел проблему:
Или, по крайней мере, часть этого. Похоже, что это было вызвано давлением ГХ, и я уже знаю, как уменьшить его в приложении. Я до сих пор не понимаю, почему SpinWait иногда вызывал блокировку потоков, но я просто не использовал его.
Этот вопрос был помечен как дубликат, и переполнение стека попросило меня отредактировать его, чтобы объяснить, почему, но, если честно, довольно чертовски ясно, что это не так, если вы даже не удосужились прочитать за заголовком.
1 ответ
Я только что заглянул в исходный код.NET, потому что сам заинтересовался этим вопросом. Таким образом, очевидно, он просто копирует текущее содержимое массива списков в новый массив.
T[] array = new T[_size];
Array.Copy(_items, 0, array, 0, _size); //_items is the lists inner array
return array;
Ничего больше, чем просто копирование.