.net - trabajar - ventajas de git
¿Cuál es el método más rápido para recuperar proyectos del equipo TFS utilizando la API TFS SDK? (1)
Al ver sus estadísticas, no veo el beneficio de encontrar el más rápido . Todos parecen claramente increíblemente rápidos. ¿Podría ser esto una preprogramación sobre la optimización?
¡Tengo algunas respuestas! Siéntase libre de contribuir con sus propios hallazgos.
Por lo que sé, hay 3 formas principales de recuperar una lista simple de proyectos de equipo de TFS:
- Uso del nuevo servicio de catálogo (TFS 2010)
- Uso de VersionControlServer (TFS 2008/2010)
- Uso de ICommonStructureService (TFS 2008/2010)
Las pruebas simples que realicé compararon los tres métodos al contar el número total de proyectos devueltos.
Método 1: Servicio de catálogo (solo 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;
}
Método 2: VersionControlServer
public IEnumerable<string> GetTeamProjectNamesUsingVCS()
{
TfsTeamProjectCollection tp = new TfsTeamProjectCollection(collectionUri);
foreach (var p in tp.GetService<VersionControlServer>().GetAllTeamProjects(false))
yield return p.Name;
}
Método 3: ICommonStructureService
public IEnumerable<string> GetTeamProjectNamesUsingStructureService()
{
var structService = new TfsTeamProjectCollection(collectionUri).GetService<ICommonStructureService>();
foreach (var p in structService.ListAllProjects())
yield return p.Name;
}
Las pruebas de unidad que ejecuté fueron súper simples. Usé el método .Count () para asegurarme de que iteramos todos los proyectos del equipo (.Any () es más rápido ya que se detendrá después de que se devuelva el primer nombre).
Resultados
Para TFS 2010, ejecutar 3 pruebas 5 veces seguidas:
Para TFS 2008, ejecute 2 pruebas (sin servicio de catálogo) 5 veces seguidas:
Sesgos
- El servidor TFS 2010 con el que se estaba ejecutando estaba en desarrollo, por lo que casi nadie lo estaba usando.
- No probé esto con ninguna cuenta de usuario con privilegios mínimos; Soy un administrador en el servidor.
- Me estoy comunicando con un servidor TFS dentro de la red corporativa.
- En TFS 2010, puede tener múltiples
TfsTeamProjectCollections
; necesitarás iterar a través de ellos también. En esta prueba, solo usé una colección. -
TfsTeamProjectCollection
el constructor para crearTfsTeamProjectCollection
;TfsTeamProjectCollectionFactory.GetTeamProjectCollection()
a usar el métodoTfsTeamProjectCollectionFactory.GetTeamProjectCollection()
y en realidad fue más lento cada prueba. Puede ser más rápido si realiza múltiples llamadas por solicitud. - Para TFS 2008, el servidor es un servidor de producción bajo carga (es decir, mundo real).
Recomendaciones
Como puede ver, parece que ICommonStructureService
es bastante rápido para encontrar todos los proyectos del equipo después de la primera ejecución . Nota: Hice pruebas anteriores usando ICommonStructureService3
(nuevo en TFS 2010 API) y el mismo código fue más lento que los otros dos métodos.
Si el rendimiento constante es clave, creo que recomendaría VersionControlServer
para hacerlo.
Sin embargo, tenga en cuenta qué es lo que quiere hacer con los proyectos del equipo. Si simplemente lo enumera es todo lo que necesita, el ICSS es probablemente el camino a seguir. Si desea utilizar la lista para la navegación, también necesitará la ruta ( $/TeamProject
) o Uri. En ese caso, VCS es probablemente la mejor manera de hacerlo ya que puede usar la propiedad ServerItem
, que contiene la ruta al elemento. También puede salirse con la concatenación de cadenas simples usando ICSS ( "$/" + p.Name
).
Espero que esto ayude a otros desarrolladores de TFS API.