【问题标题】:Performance recursive lookup function C#性能递归查找函数 C#
【发布时间】:2017-07-18 14:50:34
【问题描述】:

我们有以下递归函数用于查找成员对象,这些成员对象列在组对象的以下属性中。我们使用组列表进行组中的递归检查。

这个有大约 30k 用户和 40k 组的函数需要大约 20 分钟才能运行,我们希望加快运行速度。任何想法如何更有效地做到这一点?

foreach (ad_group_source group in group_source)
{
    List<ad_user_source> list = FindMembers(group, group_source, user_source);
}

public static List<ad_user_source> FindMembers(ad_group_source group, HashSet<ad_group_source> group_source, HashSet<ad_user_source> user_source)
{
    List<String> members = group.Members.Split(';').ToList();
    if (members.Equals(""))
    {
        return new List<ad_user_source>();
    }
    List<ad_user_source> members2 = new List<ad_user_source>();
    foreach (String member in members)
    {
        if (!member.Equals(""))
        {
            Boolean isUser = false;
            ad_user_source gebruiker = user_source.FirstOrDefault(u => u.DistinguishedName == member);
            if (gebruiker != null)
            {
                members2.Add(gebruiker);
                isUser = true;
            }
            if (!isUser)
            {
                ad_group_source group2 = group_source.FirstOrDefault(g => g.CN == member.Substring(3));
                if (group2 != null)
                {
                    List<ad_user_source> l = FindMembers(group2, group_source, user_source);
                    members2.AddRange(l);
                }
            }
         }

     }
     List<ad_user_source> members3 = members2.Distinct().ToList();
     return members3;
 }

【问题讨论】:

  • “让事情变得更快”在这里并不是世界上最大的问题,因为它可能只适用于您的代码而对其他人没有帮助。如果您想查看整个代码并提供示例数据,这可能Code Review 上没问题,但在询问之前请阅读他们的帮助中心。
  • 缓存这个操作值得吗?
  • @MikeMcCaughan:为什么它不能帮助任何人?我正在使用没有执行的递归函数?
  • 我发现这段代码有很多错误。
  • 因为改进您的代码的细节不一定与改进他人代码所需的更改相同。

标签: c# recursion


【解决方案1】:

问题在于您的代码一直使用哈希集,就好像它们是列表一样。这是非常低效的。

为了解决这个问题,构造一个由DistinguishedName 组织的Dictionary&lt;string,ad_user_source&gt;,以及由g.CN 组织的Dictionary&lt;string,ad_group_source&gt;。不要将CN 超过三个字符的组放在一起,以防原始集合中存在。

【讨论】:

  • 感谢您提供解决此问题的指导。如果可行,我会尝试并将您的答案标记为解决方案。
  • 字典的使用有巨大的性能提升。谢谢!
猜你喜欢
  • 1970-01-01
  • 2021-02-07
  • 1970-01-01
  • 1970-01-01
  • 2021-08-02
  • 2020-11-13
  • 1970-01-01
  • 1970-01-01
  • 2015-12-02
相关资源
最近更新 更多