Форум
Компьютерные священные войны
Тема
Как правильно задавать вопросы
B
I
abc
U
X
3
X
3
H1
H2
H3
H4
H5
H6
Asm
C/C++
C#
Erlang
Haskell
IDL
Java
Lisp
MSIL
Nemerle
ObjC
OCaml
Pascal
Perl
PHP
Prolog
Python
Ruby
Rust
SQL
VB
Здравствуйте, Sinclair, Вы писали: S>Здравствуйте, vdimas, Вы писали: V>>Где только возможно стоит использовать readonly-модификатор метода, ReadOnlySpan. S>А зачем? Это внутренний код, я и так могу убедиться, что я при поиске индексы не меняю. S>Кажется, я понял, в чём дело. JIT отказывается инлайнить рекурсию. S>Если посмотреть на BranchNode<LeafNode<int>, int>.getItem(), то там всё в порядке - всё инлайнится, как и ожидалось. S>А вот когда JIT видит внутри BranchNode<LeafNode<int>, int>.getItem() S>[msil] S>IL_001b: constrained. !N S>IL_0021: callvirt instance !0 class IListNodeBase`1<!T>::get_Item(int32) S>[/msil] S>и понимает, что N::get_Item - это тоже BranchNode<..., ...>::get_Item, то [i]несмотря на то, что это совсем другой метод[/i], джит решает "ой, не, это рекурсия - её инлайнить бесполезно". S>Надо бы найти это место в исходниках JIT и посмотреть, можно ли доработать детектор рекурсии. S>Варианты, как это обойти, не фикся джит: S>- вернуться к варианту с циклом. Он, в целом, был хорош всем, кроме однотипности узлов. В итоге у меня внутри листьев тратилось место на индексы, увеличивая потребление памяти, и ухудшая характеристики всех модифицирующих операций. S>- развернуть рекурсию, добавив 2-3-4 типа BranchNode1, BranchNode2, которые будут отличаться только методом SplitNGrow. Тогда медленный код будет вызываться только при очень больших глубинах дерева (например, миллион элементов требуют всего-то 4х уровней).
Теги:
Введите теги разделенные пробелами. Обрамляйте в кавычки словосочетания с пробелами внутри, например:
"Visual Studio" .NET
Имя, пароль:
Загрузить
Нравится наш сайт?
Помогите его развитию!
Отключить смайлики
Получать ответы по e-mail
Проверить правописание
Параметры проверки …