Как можно оптимизировать алгоритм построения дерева?

Рейтинг: 0Ответов: 0Опубликовано: 22.05.2023

как мне кажется, все написано оптимально, но.. хотелось бы все-таки ускорить вот мой код:

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 и тогда в памяти ненужные строки не будут оставаться? Что еще можно поправить?

Ответы

Ответов пока нет.