Меня просто смущает тот факт, что раз уж он такой умный - то зачем он не проинлайнил всё, что не лень в последнем варианте, и не получил в 2 раза более оптимальный код, нежели в первом случае...
Разница, например, в том, что в первоначальном варианте кода полностью съедаются проверки на array index out of bounds. В других двух вариантах их будет дофига.
угу, и это тоже. Причём именно в этом случае так как node.Children приходит в таком виде из другой части проекта, устранить их написанием unsafe-кода не получится... (не взять указатель на node.Children)
Я ещё писал ComplexEnumerable без обращения по индексу - с использованием исключительно интерфейсов IEnumerable - этот вариант чуть-чуть побыстрее третьего, но всё равно существенно медленнее первого, из-за большого количества отказывающихся инлайниться вызовов методов...
Лучшая оптимизация - устранение кода. Невыполнение кода занимает обычно существенно меньше времени. :)
Другими словами, такие вещи как обход дерева мы обычно оптимизируем или отсечением ветвей или прореживанием событий, которые этот обход вызывают. (Последнее, правда, чревато дополнительным стэйтом.)
угу, умный в гору не пойдёт :-) Любопытно, а какие деревья бывают в клиентах для трекеров?
Ещё один способ - попробовать проинлайнить всё вручную постпроцессингом IL-кода. Правда, он не решает проблему range checks.
Вообще ситуация заставляет задуматься над вопросом - почему такая важная для performance вещь, как директива forceinline есть только в "Microsoft'овских расширениях" языка С++...
Comments 9
Reply
Reply
Меня просто смущает тот факт, что раз уж он такой умный - то зачем он не проинлайнил всё, что не лень в последнем варианте, и не получил в 2 раза более оптимальный код, нежели в первом случае...
Reply
Reply
Reply
Reply
Лучшая оптимизация - устранение кода. Невыполнение кода занимает обычно существенно меньше времени. :)
Другими словами, такие вещи как обход дерева мы обычно оптимизируем или отсечением ветвей или прореживанием событий, которые этот обход вызывают. (Последнее, правда, чревато дополнительным стэйтом.)
Reply
Любопытно, а какие деревья бывают в клиентах для трекеров?
Ещё один способ - попробовать проинлайнить всё вручную постпроцессингом IL-кода. Правда, он не решает проблему range checks.
Вообще ситуация заставляет задуматься над вопросом - почему такая важная для performance вещь, как директива forceinline есть только в "Microsoft'овских расширениях" языка С++...
Reply
A: Навигационные.
:)
Reply
Leave a comment