Я немного исследовал, и кажется, что здравый смысл гласит, что структуры должны быть меньше 16 байт, потому что в противном случае они будут снижать производительность при копировании. С C # 7 и ref return стало довольно легко полностью избежать копирования структур. Я предполагаю, что по мере уменьшения размера структуры передача по ref имеет больше накладных расходов, чем просто копирование значения.
Есть ли практическое правило, когда передача структур по значению выполняется быстрее, чем по ссылке? Какие факторы на это влияют? (Размер структуры, разрядность процесса и т. Д.)
Больше контекста
Я работаю над игрой, в которой подавляющее большинство данных представлено в виде непрерывных массивов структур для максимального удобства работы с кешем. Как вы можете себе представить, в таком сценарии довольно часто встречается передача структур. Я знаю, что профилирование - единственный реальный способ определить влияние чего-либо на производительность. Однако я хотел бы понять теоретические концепции, лежащие в основе этого, и, надеюсь, написать код с учетом этого понимания и профилировать только крайние случаи.
Также обратите внимание, что я не спрашиваю о передовых методах или разумности передавать все по исх. Мне известны «лучшие практики» и их последствия, и я сознательно предпочитаю им не следовать.
Обращение к "повторяющемуся" тегу
Производительность передачи по значению по сравнению с передачей по ссылке в C # .NET. В этом вопросе обсуждается передача ссылочного типа по ссылке, которая полностью отличается от того, что я спрашиваю.
В .Net, когда, если когда-либо, мне следует передавать структуры по ссылке из соображений производительности? - Второй вопрос немного затрагивает тему, но он касается конкретного размера структуры.
Чтобы ответить на вопросы из статьи Эрика Липперта:
Вам действительно нужно ответить на этот вопрос? Да, я знаю. Потому что это повлияет на то, как я пишу много кода.
Это действительно узкое место? Скорее всего, нет. Но я все же хотел бы знать, поскольку это шаблон доступа к данным для 99% программы. На мой взгляд, это похоже на выбор правильной структуры данных.
Имеет ли значение разница? Это действительно так. Передача больших структур по ссылке выполняется быстрее. Я просто пытаюсь понять пределы этого.
О чем вы говорите «быстрее»? Например, когда ЦП меньше выполняет ту же задачу.
Вы смотрите на картину в целом? Да. Как уже говорилось ранее, это влияет на то, как я все это пишу.
Я знаю, что могу измерить множество различных комбинаций. И что это мне говорит? Этот X быстрее, чем Y, в моей комбинации [версия .NET, разрядность процесса, ОС, ЦП]. А как насчет Linux? А как насчет Android? А как насчет iOS? Должен ли я тестировать все перестановки на всех возможных комбинациях аппаратного и программного обеспечения?
Я не думаю, что это жизнеспособная стратегия. Поэтому я спрашиваю здесь, где, надеюсь, кто-то, кто много знает о CLR / JIT / ASM / CPU, может рассказать мне, как это работает, чтобы я мог принимать обоснованные решения при написании кода.
Ответ, который я ищу, аналогичен вышеупомянутому 16-байтовому руководству для размеров структур с объяснением почему.
ref
позволит получателю действовать с ним на месте, даже если элемент является структурным типом. Это одно из больших преимуществ использования массивов структурных типов. - person supercat   schedule 20.09.2017