Подтвердить что ты не робот

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

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

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

Выводы

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

Если согласованная производительность является ключевой, я бы рекомендовал VersionControlServer сделать это.

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

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

4b9b3361

Ответ 1

Глядя на ваши статистические данные, я не вижу преимущества поиска самого быстрого. Все они кажутся невероятно быстрыми. Может ли это быть предварительное программирование по оптимизации?