XobotOS: Почему в бинарном дереве C# используется структура?
Заинтересовавшись предполагаемым приростом производительности в xobotos, я проверил бенчмарк-код бинарного дерева.
Java-версия узла двоичного дерева:
private static class TreeNode
{
private TreeNode left, right;
private int item;
}
Версия C#:
struct TreeNode
{
class Next
{
public TreeNode left, right;
}
private Next next;
private int item;
}
Мне интересно, каково преимущество использования структуры здесь, так как указатели Next и Previous все еще заключены в класс.
Ну, есть один - листовые узлы - это чистые типы значений, так как им не нужны левый и правый указатели. В типичном двоичном дереве, где половина узлов - листья, это означает сокращение количества объектов на 50%. Тем не менее, перечисленные улучшения производительности кажутся гораздо большими.
Вопрос: есть еще что-то к этому?
Кроме того, поскольку я не думал бы об определении узлов дерева таким способом в C# (спасибо Xamarin!), Какие другие структуры данных могут получить выгоду от использования структур неочевидным способом? (Хотя это немного не по теме и с открытым концом.)
4 ответа
Это группирует два узла в одно выделение, в идеале вдвое сокращая количество общих выделений.
ИМО это делает сравнение довольно бессмысленным.
Я просто наткнулся на этот странный код и у меня возник тот же вопрос. Если вы измените код в соответствии с версией Java, он будет работать немного медленнее. Я полагаю, что большая часть "struct TreeNode" будет упакована и размещена в любом случае, за исключением нижнего ряда. Однако каждый узел имеет 2 распределения: TreeNode в штучной упаковке и класс Next. Распределение сбережений быстро исчезнет. ИМО, это не правильное использование структуры.
Структуры могут быть размещены в стеке вместо кучи (но не в каждом случае), что означает, что они удаляются из памяти, как только выходят из области видимости - сборщик мусора не участвует в этом сценарии. Это может привести к меньшей нагрузке на память и меньшему количеству сборок мусора. Кроме того, стек является (в основном) доступной областью памяти, поэтому доступ к нему имеет лучшую локальность, что может (опять же, возможно) улучшить коэффициент попадания в кэш на уровне ЦП.
Рекомендации Microsoft по выбору классов и структур:
- структуры должны быть небольшими (16 байтов в целом) и недолговечными
- они должны быть неизменными
Если они выполнены, то использование структуры над классом приведет к увеличению производительности.
Я не думаю, что использование структуры здесь имеет какое-либо значение. Особенно после просмотра исходного кода TreeNode, где экземпляры TreeNode всегда копируются в конструкторе и рекурсивном вызове bottomUpTree.