В моем приложении С# у меня есть большая структура (176 байт), которая передается потенциально сто тысяч раз в секунду для функции. Затем эта функция просто берет указатель на структуру и передает указатель на неуправляемый код. Ни функция, ни неуправляемый код не вносят никаких изменений в структуру.
Мой вопрос: должен ли я передать структуру функции по значению или по ссылке? В этом конкретном случае я предполагаю, что передача по ссылке будет намного быстрее, чем нажатие 176 байт в стек вызовов, если только JIT не узнает, что структура никогда не изменяется (моя догадка заключается в том, что она не может распознать это, поскольку структура адрес передается неуправляемому коду) и оптимизирует код.
Так как мы на нем, давайте также ответим на более общий случай, когда функция не передает указатель структуры на неуправляемый код, но вместо этого выполняет некоторую операцию только для чтения в содержимом структуры. Будет ли быстрее передавать структуру по ссылке? В этом случае JIT признает, что структура никогда не изменяется и, таким образом, оптимизируется? Предположительно, не более эффективно передавать 1-байтовую структуру по ссылке, но при каком размере структуры становится лучше передавать структуру по ссылке, если когда-либо?
Спасибо.
EDIT:
Как указано ниже, также возможно создать "эквивалентный" класс для регулярного использования, а затем использовать структуру при переходе на неуправляемый код. Здесь я вижу два варианта:
1) Создайте класс "оболочка", который просто содержит структуру, а затем при необходимости свяжет и передаст указатель на структуру неуправляемому коду. Потенциальная проблема, которую я вижу, заключается в том, что фиксация имеет свои собственные последствия.
2) Создайте эквивалентный класс, поля которого копируются в структуру при необходимости структуры. Но копирование займет много времени, и мне кажется, что в первую очередь победить точку передачи по ссылке.
EDIT:
Как уже упоминалось несколько раз, я мог бы точно измерить производительность каждого из этих методов. Я сделаю это и опубликую результаты. Тем не менее, мне все еще интересно видеть ответы и рассуждения людей с интеллектуальной точки зрения.