2009-09-02 2 views
0

Мы пытались сортировать коллекцию объектов FileInfo в .NET. Мы внедрили наш IComparer для обеспечения того, чтобы объекты FileInfo были отсортированы по нашим критериям. Затем мы заметили, что производительность сортировки объектов FileInfo во много раз медленнее, чем просто ints. В связи с догадкой (и помня, как работают ссылки на C) мы смогли повысить производительность, используя локальные переменные, чтобы ограничить количество обращений к свойствам FileInfo.Производительность ссылочного типа сортировки vs Типы значений

Моя идея заключалась в том, что локальные переменные будут быстрее доступны, чем свойства объектов. Я думаю, что это имеет смысл в мире неуправляемого кода, где я могу реально представить, как работает стек и как ссылаются значения. Тем не менее, я знаю, что мир управляемого кода может быть более сложным под обложками. Мой вопрос: могут ли эти основные идеи управления памятью и потоком программы в некорректном коде вообще проецироваться в мир управляемого кода?

В конце концов с помощью KeeperOfTheSoul мы смогли отследить это до того, как мы издевались над объектом FileInfo. По этой причине я добавил тэг RhinoMock к этому quesiton.

ответ

1

На самом деле не должно быть разницы в скорости между сортировкой типа значения по сравнению с ссылочным типом, за исключением реализации метода сравнения. Если бы я применил метод сравнения, который использовал sin, тогда ints также будет сортироваться медленно.

Доступ к собственности связан с вызовом метода при доступе к локальной переменной, либо значение находится непосредственно в стеке, либо уже в регистре. Однако простые свойства могут быть оптимизированы JIT, чтобы обеспечить что-то похожее на inlining.

В этом случае я думаю, проблема в том, что FileInfo может потребовать, чтобы файловая система считывала значение свойства, и если FileInfo не кэширует значение внутри, он может несколько раз выполнить это чтение.

+0

Я не думаю, что объект FileInfo напрямую обращается к файловой системе. В нашем тесте мы фактически издевались над файловыми объектами RhinoMock. Это поднимает хороший момент, может быть, это была рамка RhinoMock, которая замедляла наши тесты? – LJM

+0

Возможно, я думаю, что rhino mock помещает его через какое-то отражение, конечно, достаточно, чтобы оптимизировать JIT-оптимизацию. –

+0

Я только что проверил некоторые тесты для проверки, и это, безусловно, похоже на производительность на издевающихся объектах. Спасибо за помощь. – LJM

Смежные вопросы