Ответ 1
Глядя на ваши статистические данные, я не вижу преимущества поиска самого быстрого. Все они кажутся невероятно быстрыми. Может ли это быть предварительное программирование по оптимизации?
У меня есть ответы! Не стесняйтесь вносить свои собственные выводы.
Насколько я знаю, есть 3 основных способа получить простой список Team Projects из TFS:
Простые тесты, которые я провел, сравнили три метода при подсчете общего количества возвращенных проектов.
Метод 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 2008 выполняется 2 теста (без службы каталога) 5 раз подряд:
Искажения
TfsTeamProjectCollections
; вам нужно будет итерации через них. В этом тесте я использовал только одну коллекцию.TfsTeamProjectCollection
; Я переключился на использование метода TfsTeamProjectCollectionFactory.GetTeamProjectCollection()
, и он был фактически медленнее каждого тестового прогона. Это может быть быстрее, если вы делаете несколько вызовов на запрос.Выводы
Как вы можете видеть, кажется, что ICommonStructureService
довольно быстро находит все командные проекты после первого выполнения. Примечание. Я провел более ранние тесты, используя ICommonStructureService3
(новый в TFS 2010 API), и тот же код был медленнее, чем два других метода.
Если согласованная производительность является ключевой, я бы рекомендовал VersionControlServer
сделать это.
Имейте в виду, что вы хотите делать с командами. Если просто перечислять их все, что вам нужно, ICSS, вероятно, путь. Если вы хотите использовать список для навигации, вам также понадобится путь ($/TeamProject
) или Uri. В этом случае VCS, вероятно, лучше всего подходит, поскольку вы можете использовать свойство ServerItem
, которое содержит путь к элементу. Вы также можете избежать простой конкатенации строк с помощью ICSS ("$/" + p.Name
).
Надеемся, что это поможет другим разработчикам API TFS.
Глядя на ваши статистические данные, я не вижу преимущества поиска самого быстрого. Все они кажутся невероятно быстрыми. Может ли это быть предварительное программирование по оптимизации?