Cuando se ejecuta ls
sin argumentos, solo abrirá un directorio, leerá todo el contenido, los ordenará e imprimirá.
Cuando ejecuta ls *
, primero el shell se expande *
, que es efectivamente lo mismo que lo que hizo el simple ls
, construye un vector de argumento con todos los archivos en el directorio actual y las llamadas ls
. ls
luego tiene que procesar ese vector de argumento y para cada argumento, y llama access(2)
¹ al archivo para verificar su existencia. Luego imprimirá el mismo resultado que el primero (simple) ls
. Es ls
probable que tanto el procesamiento de shell del vector de argumento grande como el de s impliquen una gran asignación de memoria de bloques pequeños, lo que puede llevar algún tiempo. Sin embargo, dado que había poco sys
y user
tiempo, pero mucho real
tiempo, la mayor parte del tiempo se hubiera pasado esperando el disco, en lugar de usar la CPU para asignar la memoria.
Cada llamada a access(2)
tendrá que leer el inodo del archivo para obtener la información del permiso. Eso significa muchas más lecturas y búsquedas de disco que simplemente leer un directorio. No sé qué tan caras son estas operaciones en su GPFS, pero como la comparación que ha demostrado ls -l
que tiene un tiempo de ejecución similar al del comodín, parece dominar el tiempo necesario para recuperar la información del inodo. Si GPFS tiene una latencia ligeramente mayor que su sistema de archivos local en cada operación de lectura, esperaríamos que sea más pronunciada en estos casos.
La diferencia entre el caso comodín y el ls -l
50% podría explicarse por el pedido de inodos en el disco. Si los inodes se dispusieran sucesivamente en el mismo orden que los nombres de archivo en el directorio y ls -l
stat (2) editara los archivos en orden de directorio antes de ordenarlos, ls -l
posiblemente leería la mayoría de los inodes en un barrido. Con el comodín, el shell ordenará los nombres de los archivos antes de pasarlos ls
, por ls
lo que probablemente leerá los inodos en un orden diferente, agregando más movimiento de la cabeza del disco.
Cabe señalar que su time
salida no incluirá el tiempo que tarda el shell para expandir el comodín.
Si realmente quieres ver lo que está pasando, usa strace(1)
:
strace -o /tmp/ls-star.trace ls *
strace -o /tmp/ls-l-star.trace ls -l *
y eche un vistazo a las llamadas del sistema que se realizan en cada caso.
¹ No sé si access(2)
realmente se usa, o algo más como stat(2)
. Pero ambos probablemente requieran una búsqueda de inodo (no estoy seguro si access(file, 0)
pasarían por alto una búsqueda de inodo).
ls
solo preguntarle al sistema de archivos "para qué son los hijos del inodopwd
" dónde como conls *
tiene que preguntar "cuáles son los elementos secundarios (y cuál es el archivo) del inodoa
" seguido de b, c, d, etc. etc. Una consulta frente a muchas.