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;
}

しかし、2 番目のアプローチは最初のアプローチよりもかなり遅いことが判明しました (約 10 倍遅い)。これにはどのような理由が考えられますか?

4

1 に答える 1

1

ツリー内の最初の項目の 1 つを常に検索すると、再帰が高速になる場合があります。また、ディクショナリで使用する または比較子のEquals実装にも依存します。BaseId再帰的な方法では、参照比較があります。辞書はGetHashCodeとを使用しEqualsます。

どのようにパフォーマンスを測定しましたか?

于 2013-10-07T06:58:42.430 に答える