为什么字典查找比递归搜索慢
本文关键字:搜索 递归 字典 查找 为什么 | 更新日期: 2023-09-27 18:34:06
我试图优化对TreeNodeCollection
中节点的搜索。原始方法使用递归方法:
public UGTreeNode FindNode(BaseId nodeId, TreeNodeCollection nodes)
{
foreach (UGTreeNode n in nodes)
{
if (n.node_info.Description.base_id.Id == nodeId.Id &&
n.node_info.Description.base_id.RootId == nodeId.RootId &&
n.node_info.Description.base_id.SubId == nodeId.SubId)
return n;
UGTreeNode n1 = FindNode(nodeId, n.Nodes);
if (n1 != null)
return n1;
}
return null;
}
我尝试将所有节点存储在Dictionary
中,并使用Dictionary.TryGetValue
搜索节点:
public UGTreeNode FindNode(BaseId nodeId, TreeNodeCollection nodes)
{
UGTreeNode res;
_nodesCache.TryGetValue(nodeId.Id, out res);
return res;
}
但事实证明,第二种方法比第一种方法慢得多(大约慢10倍)。可能的原因是什么?
当您始终搜索树中的第一项时,递归可能会更快。它还取决于字典中使用的BaseId
或比较器的Equals
实现。在递归方法中,您有引用比较。字典使用GetHashCode
和Equals
。
您是如何衡量绩效的?