Типы значений могут быть созданы в стеке, но если они передаются из потока в поток, они должны быть скопированы в stackA-> heap и heap-> stackB, я полагаю.
Нет, это совсем не так.Но у вас есть более глубокая проблема в вашем мышлении:
Немедленно прекратите думать о структурах как о живущих в стеке .Когда вы создаете массив int с миллионами целочисленных значений, вы думаете, что эти четыре миллиона байтов целых чисел живут в вашем стеке размером в один миллион байтов?Конечно, нет.
Правда в том, что стек против кучи не имеет ничего общего с типами значений.Вместо «стек и куча» начните говорить «пул краткосрочного распределения» и «пул долгосрочного распределения». Переменные с коротким временем жизни выделяются из пула краткосрочного выделения , независимо от того, содержит ли эта переменная int или ссылку на объект.Как только вы начинаете думать о переменном времени жизни, ваши рассуждения становятся совершенно простыми. Очевидно, что краткосрочные объекты живут в краткосрочном пуле.
Итак: когда вы передаете структуру из одного потока в другой, она когда-нибудь живет "в куче"? Вопрос бессмысленный, потому что ценности - это не вещи, которые живут в куче . Переменные - это вещи, которые являются хранилищем;переменные store value.
Итак: это тот случай, когда преобразование классов в структуры улучшит производительность, потому что "эти структуры могут жить в стеке"?Нет, конечно нет. Соответствующая разница между ссылочными типами и типами значений заключается не в том, где они живут, а в том, как они копируются .Типы значений копируются по значению, ссылочные типы копируются по ссылкам, а эталонные копии являются самыми быстрыми копиями.
Я вижу множество создаваемых объектов и возглавляющих список самых распространенных объектов в памяти.Обратите внимание, что утечки памяти нет, GC может аккуратно очищать все при каждом срабатывании, но очевидно, что очень много быстро создаваемых объектов делает Gen 0 очень большим.Интересно, может ли лучшее использование памяти дать лучшую производительность.
Хорошо, теперь мы подошли к разумной части вашего вопроса. Это превосходное наблюдение, которое можно проверить наукой .Первое, что вы должны сделать, это использовать профилировщик, чтобы определить, какова фактическая нагрузка коллекций поколения 0 на производительность вашего приложения.
Возможно, эта нагрузка составляет , а не .самая медленная вещь в вашей программе и на самом деле это не имеет значения.В этом случае вы теперь будете знать, как сосредоточить свои усилия на реальной проблеме, а не на том, чтобы преследовать проблемы выделения памяти, которые не являются реальными проблемами.
Предположим, вы обнаружили, что коллекции поколения 0 действительно снижают вашу производительность;что ты можешь сделать?Является ли ответ, чтобы сделать больше вещей структур?Это может сработать, но вы должны быть очень осторожны:
- Если сами структуры содержат ссылки, вы просто отодвинули проблему на один уровень, но не решили ее.
- Если структуры больше ссылочного размера - и, конечно, они почти всегда таковы - то теперь вы копируете их, копируя всю структуру, а не копируете ссылку, и вы обменяли проблему времени GC на копиюпроблема времениЭто может быть победой или проигрышем; используйте науку, чтобы узнать, что это такое .
Когда мы столкнулись с этой проблемой в Рослине, мы очень тщательно обдумали ее и провели лот экспериментов.В целом мы использовали стратегию , а не для перемещения вещей в стек.Скорее, мы определили, сколько небольших, недолговечных объектов было активными в памяти одновременно, каждого типа - с использованием профилировщика - и затем реализовали стратегию объединения этих объектов.Вам нужен маленький предмет, вы вынимаете его из бассейна.Когда вы закончите, вы положите его обратно в бассейн.В результате вы получаете O (количество активных одновременно объектов) в пуле, которое быстро перемещается в кучу второго поколения;Затем вы значительно снижаете нагрузку на коллекцию Gen 0 и увеличиваете стоимость сравнительно редких коллекций Gen 2.
Я не говорю, что это лучший выбор для вас.Я говорю, что у нас была такая же проблема в Рослине, и мы решили ее с помощью науки .Вы можете сделать то же самое.