Comando de medida: una comparación de velocidad (Foreach vs. Foreach-Object)
Measure-Command mide cuánto tiempo tarda en completarse un comando o script. Esto es particularmente importante para procesar grandes cantidades de datos.
Medida-Comando
En este primer ejemplo, mido el comando Get-ChildItem buscando todos los archivos con el nombre de archivo Windows.
Measure-Command {Get-Childitem -Path c: -File -Recurse -ErrorAction SilentlyContinue | Where-Object Name -eq "Windows"}Tardaron unos 44 segundos. Eso es rápido. Tengo un SSD.
La comparación
Foreach-Objeto
Ahora, midamos otro comando con Foreach-Object:
Measure-Command {0..1000000 | Foreach-Object $_}8 segundos. Nada mal.
Para cada
Si hago lo mismo con foreach en lugar de Foreach-Object entonces tengo que aceptar que soy mucho más rápido.
$i=0
Measure-Command {foreach ($i in 0..1000000) {$i++}}
3,5 segundos. Microsoft explica por qué es como es:
https://blogs.technet.microsoft.com/heyscriptingguy/2014/07/08/getting-to-know-foreach-and-foreach-object/
Conclusión
Foreach consume más memoria, pero es más rápido. Todos los objetos se almacenan en la memoria. Con Foreach-Object, los objetos se procesan uno tras otro y los resultados de cada objeto que pasa por la tubería se generan instantáneamente. De todos modos, mi favorito es Foreach-Object. ?
Más información: https://www.pluralsight.com/blog/tutorials/measure-powershell-scripts-speed.


