Производительность сортировки ссылочного типа по сравнению с типами значений
Мы пытались отсортировать коллекцию объектов FileInfo в.NET. Мы реализовали наш IComparer, чтобы гарантировать, что объекты FileInfo были отсортированы в соответствии с нашими критериями. Затем мы заметили, что производительность сортировки объектов FileInfo во много раз ниже, чем просто целочисленных значений. Если догадываться (и помнить, как работают ссылки в C), мы смогли улучшить производительность, используя локальные переменные, чтобы ограничить количество обращений к свойствам FileInfo.
Моя идея заключалась в том, что к локальным переменным будет доступ быстрее, чем к свойствам объектов. Я думаю, что это имеет смысл в мире неуправляемого кода, где я действительно могу представить, как работает стек и как на него ссылаются значения. Тем не менее, я знаю, что мир управляемого кода может быть более сложным под покровом. Мой вопрос: могут ли эти основные идеи управления памятью и потоком программ в неуправляемом коде быть в целом спроецированы в мир управляемого кода?
В конечном итоге с помощью KeeperOfTheSoul мы смогли отследить это до того, как насмехались над объектом FileInfo. По этой причине я добавил тег RhinoMock в это задание.
1 ответ
На самом деле не должно быть разницы в скорости сортировки типа значения по сравнению с ссылочным типом, за исключением реализации метода сравнения. Если бы я реализовал метод сравнения, в котором использовался грех, то целые также сортировались бы медленно.
Доступ к свойству включает вызов метода, а при доступе к локальной переменной либо значение находится непосредственно в стеке, либо уже в регистре. Однако простые свойства могут быть оптимизированы JIT для обеспечения чего-то похожего на встраивание.
В этом случае я думаю, что проблема в том, что FileInfo может потребовать чтения файловой системы для получения значения свойств, и если FileInfo не внутренне кэширует значение, он может выполнить это чтение повторно.