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

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

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

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

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

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

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

1 Ответ

8 голосов
/ 28 ноября 2010

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

...