Навело вопросом про способы организации деревьев на С...
Ведь есть возможность для шаблонных деревьев типа stl перенести в объектник методы вставки — удаления нод. Достаточно передавать указатель на функцию сравнения нод (которая в свою очередь будет уметь приводить их к типу элемента дерева). Минусом является невозможность инлайнинга функторов сравнения элементов. Зато можно довольно ощутимо снизить размер сегмента кода. Вопрос в том, что же перевесит — ускорение за счет inline или cache latency. Тестирование "в лоб" показало снижение производительности в среднем процентов на 30. Но если в приложении куча деревьев разного типа, может компактность будет более предпочтительной?
Есть мнения?
Здравствуйте, sokel, Вы писали:
S>Есть мнения?
Есть мнение, что выбор "размер vs скорость" должен решаться каждый раз в зависимости от ситуации. Где-то важнее скорость, а где-то размер. Так что оба подхода (и с инлайном (C++ style) и с указателем на ф-ию (C-style)) имеют право на жизнь. Выбирать должен программист.
Здравствуйте, sokel, Вы писали:
S>Навело вопросом про способы организации деревьев на С... S>Ведь есть возможность для шаблонных деревьев типа stl перенести в объектник методы вставки — удаления нод. Достаточно передавать указатель на функцию сравнения нод (которая в свою очередь будет уметь приводить их к типу элемента дерева).
ИМХО чем меньше вызовов функций, тем лучше. Это совсем не такое дешевое удовольствие, а если еще и на каждую вставку будет энное количество сравнений через функцию, то скорость действительно упадет.
>Минусом является невозможность инлайнинга функторов сравнения элементов. Зато можно довольно ощутимо снизить размер сегмента кода.
А зачем ? Код и так чаще всего имеет очень малый размер по сравнению с объемом данных.
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>ИМХО чем меньше вызовов функций, тем лучше. Это совсем не такое дешевое удовольствие, а если еще и на каждую вставку будет энное количество сравнений через функцию, то скорость действительно упадет.
Код, разбухающий от обилия шаблонных методов тоже не есть хорошо. Поиск по разноуровневым кэшам и чтение из памяти тоже не дешевое удовольствие.
>>Минусом является невозможность инлайнинга функторов сравнения элементов. Зато можно довольно ощутимо снизить размер сегмента кода.
PD>А зачем ? Код и так чаще всего имеет очень малый размер по сравнению с объемом данных.
Если в приложении много вставок — удалений в деревья различных типов, для каждого из них будут сгенерированы свои шаблонные методы. В результате при очередной вставке будет меньше вероятность получить искомый кусок кода в кэшах различного уровня.
Вариант реализации — легковесная шаблонная обвязка с инлайновым поиском и вынесенными в cpp методами перебалансировки дерева. Проект большой, создать эталонную нагрузку для оценки производительности тяжело. Интересует — не задавался ли кто ранее тем же вопросом, и если да, то к каким выводам пришел.
Здравствуйте, sokel, Вы писали:
S>Навело вопросом про способы организации деревьев на С... S>Ведь есть возможность для шаблонных деревьев типа stl перенести в объектник методы вставки — удаления нод. Достаточно передавать указатель на функцию сравнения нод (которая в свою очередь будет уметь приводить их к типу элемента дерева). Минусом является невозможность инлайнинга функторов сравнения элементов. Зато можно довольно ощутимо снизить размер сегмента кода. Вопрос в том, что же перевесит — ускорение за счет inline или cache latency. Тестирование "в лоб" показало снижение производительности в среднем процентов на 30. Но если в приложении куча деревьев разного типа, может компактность будет более предпочтительной? S>Есть мнения?
Здравствуйте, sokel, Вы писали:
S>Здравствуйте, Pavel Dvorkin, Вы писали:
PD>>ИМХО чем меньше вызовов функций, тем лучше. Это совсем не такое дешевое удовольствие, а если еще и на каждую вставку будет энное количество сравнений через функцию, то скорость действительно упадет.
S>Код, разбухающий от обилия шаблонных методов тоже не есть хорошо.
У тебя там что, десятки типов для элемента дерева ? И вперемежку выполняются вставки в деревья разных типов ? Вряд ли. А остальное оставь диспетчеру памяти, он ненужные страницы уберет.
S>Если в приложении много вставок — удалений в деревья различных типов, для каждого из них будут сгенерированы свои шаблонные методы. В результате при очередной вставке будет меньше вероятность получить искомый кусок кода в кэшах различного уровня.
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>У тебя там что, десятки типов для элемента дерева ? И вперемежку выполняются вставки в деревья разных типов ? Вряд ли. А остальное оставь диспетчеру памяти, он ненужные страницы уберет.
Именно десятки и именно вперемежку. А что в этом такого? Таймеры, индексы всех сортов по таблицам из БД и т.п. Вопрос не в том, чтобы убрать лишние страницы, вопрос в том чтобы нужная страница всегда доступна была.
Здравствуйте, sokel, Вы писали:
S>Именно десятки и именно вперемежку. А что в этом такого? Таймеры, индексы всех сортов по таблицам из БД и т.п. Вопрос не в том, чтобы убрать лишние страницы, вопрос в том чтобы нужная страница всегда доступна была.
Ну если так...
Могу только одно сказать в заключение. Я не поверю никаким теоретическим рассуждениям , как бы хорошо они не были обоснованы. Только сравнением работы кода можно здесь что-то доказать или опровергнуть.