2010-09-01 211 views
26

我有一些答案!随意贡献自己的发现。使用TFS SDK API检索TFS团队项目的最快方法是什么?

据我所知,有从TFS检索团队项目的简单列表3种主要方式:

  • 使用新目录服务(TFS 2010)
  • 使用VersionControlServer(TFS 2008/2010)
  • 使用ICommonStructureService(TFS 2008/2010)

的简单测试我进行比较了三种方法计数项目总数时返回。

方法1:目录服务(TFS 2010只)

public IEnumerable<string> GetTeamProjectNamesUsingCatalog() 
    { 
     ReadOnlyCollection<CatalogNode> projectNodes = new TfsTeamProjectCollection(collectionUri).CatalogNode.QueryChildren(
        new[] { CatalogResourceTypes.TeamProject }, 
        false, CatalogQueryOptions.None); 

     foreach (var tp in projectNodes) 
      yield return tp.Resource.DisplayName; 
    } 

方法2:VersionControlServer

public IEnumerable<string> GetTeamProjectNamesUsingVCS() 
    { 
     TfsTeamProjectCollection tp = new TfsTeamProjectCollection(collectionUri); 

     foreach (var p in tp.GetService<VersionControlServer>().GetAllTeamProjects(false)) 
      yield return p.Name; 
    } 

方法3:ICommonStructureService

public IEnumerable<string> GetTeamProjectNamesUsingStructureService() 
    { 
     var structService = new TfsTeamProjectCollection(collectionUri).GetService<ICommonStructureService>(); 

     foreach (var p in structService.ListAllProjects()) 
      yield return p.Name; 
    } 

我跑的单元测试非常简单。我使用了.Count()方法来确保我们迭代了所有的团队项目(.Any()更快,因为它会在返回名字后停止)。

结果

对于TFS 2010,运行3次测试5次连续:

TFS 2010 Chart Average Duration

TFS 2010 Duration Results

对于TFS 2008,运行2个测试(没有目录服务)连续5次:

TFS 2008 Chart Average Duration

TFS 2008 Duration Results

偏见

  • 这是对正在运行的TFS 2010服务器在发展,所以几乎没有人使用它。
  • 我没有对任何最低权限的用户帐户进行测试;我是服务器上的管理员。
  • 我正在与公司网络内的TFS服务器进行通信。
  • 在TFS 2010中,您可以有多个TfsTeamProjectCollections;你也需要遍历这些。在这个测试中,我只使用了一个集合。
  • 我用构造函数来创建TfsTeamProjectCollection;我转向使用TfsTeamProjectCollectionFactory.GetTeamProjectCollection()方法,实际上每次测试运行都很慢。如果您每次请求拨打多个电话,速度可能会更快。
  • 对于TFS 2008,服务器是负载下的生产服务器(即真实世界)。

发现

正如你可以看到,它好像ICommonStructureService是相当快的找到所有的球队在第一次执行后项目注意:我已经使用ICommonStructureService3(TFS 2010 API中的新增功能)完成了较早的测试,并且相同的代码比其他两种方法更慢。

如果一致的性能是关键,我想我会推荐VersionControlServer来做到这一点。

但请记住你想要对团队项目做些什么。如果简单地列出它们是你所需要的,那么ICSS可能是最好的选择。如果您想使用列表进行导航,则还需要路径($/TeamProject)或Uri。在这种情况下,VCS可能是最好的方法,因为您可以使用ServerItem属性,该属性包含该项目的路径。使用ICSS("$/" + p.Name)您也可以避免使用简单字符串连接。

希望这可以帮助其他TFS API开发人员。

+0

尽管主题涉及到性能,但请注意'VersionControlServer'并不总是列出所有团队项目。这可能与该项目是否使用源代码管理有关。 – 2017-02-02 19:45:24

回答

8

看着你的统计数据,我没有看到找到最快的的好处。他们都显得非常快速。这是否可以通过优化进行预编程?

相关问题