У меня есть класс узлов, который содержит только свойства типа значения и один ссылочный тип: это родительский узел. При выполнении поиска деревьев эти узлы создаются и уничтожаются сотни тысяч раз за очень короткий промежуток времени.C# Как эффективно объединить объекты дерева узлов?
public class Node
{
public Node Parent { get; set; }
public int A { get; set; }
public int B { get; set; }
public int C { get; set; }
public int D { get; set; }
}
Дерево поиска выглядит примерно так:
public static Node GetDepthFirstBest(this ITree tree, Node root)
{
Node bestNode = root;
float bestScore = tree.Evaluate(root);
var stack = new Stack<Node>();
stack.Push(root);
while(stack.Count > 0)
{
var current = stack.Pop();
float score = tree.Evaluate(current);
if (score > bestScore)
{
bestNode = current;
bestScore = score;
}
var children = tree.GetChildren(current);
foreach(var c in children) { stack.Push(c); }
}
return bestNode;
}
Поскольку это делается в режиме исполнения Mono, который имеет очень старый GC, я хотел, чтобы попытаться объединить объекты узла. Однако я не понимаю, как узнать, когда объект узла безопасен для возврата в пул, поскольку другие узлы, которые все еще используются, могут ссылаться на него как на родителя. В конце поиска возвращается лучший узел, и список узлов формируется путем перехода назад через своих предков. Я полностью контролирую, как узлы создаются внутри дерева, если это полезно.
Какие варианты я мог бы попробовать и реализовать?
Добро пожаловать на ТАК! Это довольно широко. Подумайте о том, чтобы опубликовать свой _-node-_ класс, чтобы помочь нам помочь вам. _ [Как задать хороший вопрос?] (Http://stackoverflow.com/help/how-to-ask) _ – MickyD