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;

Ничего больше, чем просто копирование.

Другие вопросы по тегам