Наиболее вероятная причина заключается в том, что оптимизатор времени выполнения C # выполняет лучшую работу, когда вы работаете с плавающими с полными структурами, возможно, потому, что оптимизатор отображает x и y в регистры или аналогично изменениям, не выполненным с полной структурой.
В вашем конкретном примере, кажется, нет какой-либо фундаментальной причины, по которой он не мог бы работать так же хорошо, когда вы используете структуры (трудно убедиться, не увидев фактического кода тестирования), но это не так. Однако было бы интересно сравнить производительность результирующего кода при компиляции с другими реализациями C # (я думаю о моно в Linux).
Я тестировал бенчмарк Рона Уорхолика с моно, и результаты совпадают с оценкой Марка, разница между двумя типами доступа кажется минимальной (версия с плавающими на 1% быстрее). Тем не менее, мне все же следует проводить больше тестов, поскольку не удивительно, что библиотечные вызовы, такие как Math.Abs, занимают много времени, и это может скрыть реальную разницу.
После удаления вызовов Math.Abs и просто выполнения тестов, подобных rawFloats[i] < rawFloats[j]
, версия структуры становится немного быстрее (около 5%), чем два массива с плавающей точкой.