2

我试图优化对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;
}

我尝试将所有节点存储在 a 中Dictionary并用于Dictionary.TryGetValue搜索节点:

public UGTreeNode FindNode(BaseId nodeId, TreeNodeCollection nodes)
{
    UGTreeNode res;
    _nodesCache.TryGetValue(nodeId.Id, out res);
    return res;
}

但事实证明,第二种方法比第一种方法慢得多(大约慢 10 倍)。可能的原因是什么?

4

1 回答 1

1

当您总是搜索树中的第一个项目时,递归可能会更快。它还取决于您在字典中使用Equals的或比较器的实现。BaseId在递归方法中,您有参考比较。字典使用GetHashCodeand Equals

你是如何衡量表现的?

于 2013-10-07T06:58:42.430 回答