Как можно оптимизировать алгоритм построения дерева?
как мне кажется, все написано оптимально, но.. хотелось бы все-таки ускорить вот мой код:
private async Task DeliveryCallback(
IMqttClient sender,
MqttDelivery delivery)
{
var subTopic = delivery.Topic.Split('/');
TreeRoot.Add(subTopic);
}
TreeRoot
- это класс, представляющий "дерево", вот как все это выглядит:
public readonly SortedDictionary<string, TreeNode> TreeChildren = new();
public void Add(string[] subTopic) =>
Add(subTopic, Level + 1);
private bool Add(IReadOnlyList<string> topic, int level)
{
if(level >= topic.Count)
return false;
var part = topic[level];
if(!TreeChildren.TryGetValue(part, out var trie))
{
TreeChildren.Add(part, trie = new TreeNode(part, level, this));
}
trie.Add(topic, level + 1);
return true;
}
Словарь на UI я показывать не могу, поэтому раз в секунду преобразую в плоский список. Делается это так: // вызывается 1 раз в 1000 мс
private void Update()
{
AppendItems();
this.RaisePropertyChanged(nameof(VisibleChildren));
}
private void AppendItems()
{
_updateEnqueued = false;
var flatTreeList = new List<TreeNode>();
AppendItems(flatTreeList, this);
VisibleChildren = flatTreeList;
}
static private void AppendItems(
ICollection<TreeNode> flatTreeList,
TreeNode treeNode)
{
flatTreeList.Add(treeNode);
foreach(var ch in treeNode.TreeChildren)
AppendItems(flatTreeList, ch.Value);
}
Я не уверен, но может стоит var subTopic = delivery.Topic.Split('/');
заменить на Span и тогда в памяти ненужные строки не будут оставаться?
Что еще можно поправить?
Источник: Stack Overflow на русском