【问题标题】:Performance issue when querying source control permissions with TFS SDK使用 TFS SDK 查询源代码控制权限时的性能问题
【发布时间】:2013-08-30 09:45:36
【问题描述】:

我遇到了 TFS 的性能问题。这个问题似乎与版本无关,我在 TFS 2012 和 TFS 2010 中遇到过。

我正在为 TFS 开发权限管理工具。当用户选择团队项目集合和特定项目时,我会发起查询以获取所有源代码管理项权限,并构建缓存。在开发过程中,我用小型本地项目进行了测试,我没有注意到任何性能问题,但是在稍微大一点的项目(5000 多个文件)中,查询变得非常慢。

我使用VersionControlServer.GetPermissions method 进行此查询。

我尝试将其命名为仅提供带有RecursionType.Full 的根项目,但随后我没有收到所有项目权限,只有那些经过身份验证的用户具有明确权限的项目权限(我猜)。

所以,我调用了提供项目所有项目的方法,并将递归设置为RecursionType.None。以下是代码的重要行:

    ItemSet projectItems = VersionControlServer
                    .GetItems(projectRootItem, RecursionType.Full);
    IEnumerable<string> serverItems = projectItems.Items
                                            .Select(i => i.ServerItem);
    IEnumerable<ItemSecurity> itemSecurities = VersionControlServer
                    .GetPermissions(serverItems.ToArray(), RecursionType.None);

我希望最后一行对 TFS 进行一次调用,但是当我分析应用程序时,我看到 HTTP 请求数量不合理,对 7800 个文件的 11993 个请求,并且该方法运行了大约 2分钟。

我花了很多时间试图找出这种行为的原因,但没有成功。我在TFS SDK 中也找不到好的替代解决方案。

任何帮助将不胜感激!

【问题讨论】:

    标签: c# .net performance tfs tfs-sdk


    【解决方案1】:

    我有一件事。

    您的查询非常慢,因为首先,您将所有 projectItems.Items 放到一个列表中,然后,当您将其作为参数传递给方法 VersionControlService.GetPermissions() 时,您使用 ToArray() 将其转换为数组,这会导致复制列表中的所有项目。

    我建议您不要将项目转换为List。请改用IEnumerable&lt;string&gt;。

    【讨论】:

    • 感谢您的建议!我编辑更新了我的代码和问题。我做了一个快速测量。我们已经接近了几秒钟,但查询本身仍然需要大约 1:50。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-21
    • 2012-01-20
    • 1970-01-01
    • 2016-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多