Programación de computadora: ¿Es el modo secuencial de la tubería de PowerShell más eficiente en memoria? ¿Por qué o por qué no?

Eso realmente depende de lo que lo estés comparando con 🙂

Esto es lo que Tobias Weltner, autor del libro Master-PowerShell (disponible de forma gratuita en http://PowerShell.com) tiene que decir sobre esto:

Streaming: ¿Procesamiento en tiempo real o modo de bloqueo?
Cuando combine varios comandos en una canalización, querrá comprender cuándo se procesará cada comando por separado: de forma consecutiva o al mismo tiempo. La tubería procesará los resultados en tiempo real, al menos cuando los comandos encadenados en la tubería admitan el procesamiento en tiempo real. Es por eso que hay dos modos de tubería:

  • Modo secuencial (lento): en el modo secuencial, los comandos de canalización se ejecutan de uno en uno. Por lo tanto, los resultados del comando pasan al siguiente solo después de que el comando haya realizado su tarea por completo. Este modo es lento y ahorra memoria porque los resultados se devuelven solo después de que todos los comandos terminen su trabajo y la canalización tenga que almacenar los resultados completos de cada comando. El modo secuencial básicamente corresponde al concepto de variable que primero guarda el resultado de un comando en una variable antes de reenviarlo al siguiente comando.
  • Modo de transmisión (rápido): el modo de transmisión procesa inmediatamente el resultado de cada comando. Cada resultado se pasa directamente al comando subsiguiente. Correrá a través de toda la tubería y se emitirá de inmediato. Este modo rápido ahorra memoria porque los resultados se emiten mientras los comandos de la tubería siguen realizando sus tareas, y solo un elemento recorre la tubería a la vez. La canalización no tiene que almacenar todos los resultados del comando, sino solo un resultado a la vez.

Una cosa que agregar, ya que el modo de transmisión hace que los objetos se muevan rápidamente a través de toda la tubería, se obtiene el primer resultado antes. Lo que en caso de que escribas una aplicación interactiva es realmente importante. Devolver 10 resultados después de 10 segundos se siente mucho más lento que devolver 10 resultados en un lapso de 10 segundos, es decir, un resultado por segundo.

Pero en general no tienes que preocuparte por esto en PowerShell. Generalmente prefiero el código que es más fácil de leer que el código feo más eficiente. Eso es hasta que surgen graves problemas de rendimiento. Por supuesto, estos deben ser medibles al monitorear la cantidad de memoria consumida, el tiempo necesario para realizar la tarea, etc.

SI entiendo la pregunta correctamente … No. La canalización pasará un objeto completo de un cmdlet a otro y requiere el procesamiento de cada miembro del objeto en función de los criterios especificados. El filtrado es, con mucho, el mejor método, ya que solo pasa los resultados correspondientes de un cmdlet a otro, reduciendo drásticamente no solo la huella de memoria, sino también la velocidad de ejecución.

Tomar como ejemplo:

$ q1 = “Seleccione el dominio de win32_useraccount donde name =` ‘$ account`’ “

$ result1 = Get-WmiObject -Query $ q1 | Select-Object -ExpandProperty Domain

Es exponencialmente más rápido que esto:

$ result1 = Get-WmiObject -Class Win32_userAccount | Donde-Objeto {$ _. Nombre = $ cuenta} | Select-Object -ExpandProperty Domain

¿¿Cuanto más rápido?? Esto mucho más rápido:

# 1 WQL:

C: \ WINDOWS \ system32> $ q1 = “Seleccione Dominio de win32_useraccount donde nombre =` ‘ `'”

Medida-Comando {Get-WmiObject -Query $ q1 | Select-Object -ExpandProperty Domain}

Dias: 0

Horas: 0

Minutos: 0

Segundos: 0

Milisegundos: 223

Garrapatas: 2238918

Total de días: 2.59134027777778E-06

TotalHours: 6.21921666666667E-05

TotalMinutos: 0.00373153

Total de segundos: 0.2238918

TotalMillisegundos: 223.8918

# 2 Cmdlets estándar:

C: \ WINDOWS \ system32> Measure-Command {Get-WmiObject -Class Win32_userAccount | Where-Object {$ _. Name = ““} | Select-Object -ExpandProperty Domain}

Dias: 0

Horas: 0

Minutos: 2

Segundos: 56

Milisegundos: 264

Garrapatas: 1762648767

TotalDays: 0.00204010273958333

TotalHours: 0.04896246575

TotalMinutos: 2.937747945

Total de segundos: 176.2648767

TotalMillisegundos: 176264.8767

Resultado:

223ms vs 2m 56s.

No, solo está ahí para hacer la tarea más fácil y menos tediosa.