Hemos encontrado un problema de rendimiento inesperado al recorrer directorios en busca de archivos utilizando un patrón de comodín.Win32 API FindFirstFile y FindNextFile rendimiento frente a la línea de comandos
Tenemos 180 carpetas cada una con 10.000 archivos. Una búsqueda en línea de comandos usando dir <pattern> /s
se completa casi al instante (< 0,25 segundos). Sin embargo, desde nuestra aplicación, la misma búsqueda demora entre 3 y 4 segundos.
Inicialmente hemos intentado utilizar System.IO.DirectoryInfo.GetFiles()
con SearchOption.AllDirectories
y ahora hemos probado las llamadas a la API de Win32 FindFirstFile()
y FindNextFile()
.
Hacer un perfil de nuestro código utilizando indica que la gran mayoría del tiempo de ejecución se utiliza en estas llamadas.
Nuestro código se basa en la siguiente entrada en el blog:
Encontramos que esto es lento por lo que la función de actualización GetFiles
tomar un patrón string
de búsqueda en lugar de un predicado.
¿Alguien puede arrojar alguna luz sobre lo que podría estar mal con nuestro enfoque?
¿qué estás utilizando para hacer la búsqueda desde la línea de comandos? ¿Podría ser que esté usando los índices de búsqueda de Windows para hacer la consulta en lugar de recorrer cada archivo? –
@Matt solo estamos haciendo un 'dir/s' (he actualizado mi publicación en consecuencia). –
Suena sospechoso. Dudo seriamente que "dir" use cualquier otra cosa, excepto FindFirstFile/FindNextFile también. Tal vez los malgastes. ¿Podría proporcionar un fragmento que ilustre cómo los usa? – sharptooth