Какой самый быстрый способ получения командных проектов TFS с использованием API TFS SDK?

У меня есть несколько ответов! Не стесняйтесь вносить свои собственные выводы.

Насколько мне известно, есть 3 основных способа получения простого списка командных проектов из TFS:

  • Использование новой службы каталогов (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 в корпоративной сети.
  • В TFS 2010 у вас может быть несколько TfsTeamProjectCollections ; вам нужно будет перебирать их тоже. В этом тесте я использовал только одну коллекцию.
  • Я использовал конструктор для создания TfsTeamProjectCollection ; Я переключился на использование метода TfsTeamProjectCollectionFactory.GetTeamProjectCollection () , и он был на самом деле медленнее при каждом запуске теста. Это может быть быстрее, если вы делаете несколько вызовов на запрос.
  • Для TFS 2008 сервер является рабочим сервером под нагрузкой (т. е. реальным миром).

Выводы

Как вы можете видеть, похоже, что ICommonStructureService довольно быстро находит все командные проекты после первое исполнение . Примечание. Ранее я проводил тесты с использованием ICommonStructureService3 (впервые в API TFS 2010), и тот же код был медленнее, чем два других метода. d рекомендую VersionControlServer сделать это.

Однако имейте в виду, что именно вы хотите делать с командными проектами. Если просто перечислить их все, что вам нужно, ICSS, вероятно, путь. Если вы хотите использовать список для навигации, вам также понадобится путь ( $ / TeamProject ) или Uri. В таком случае, VCS, вероятно, является лучшим способом, поскольку вы можете использовать свойство ServerItem , которое содержит путь к элементу. Вы также можете обойтись без простой конкатенации строк с использованием ICSS ( "$ /" + p.Name ).

Надеюсь, что это поможет некоторым другим разработчикам API TFS.

26
задан 3 revs 1 September 2010 в 15:30
поделиться