A menos que o autor desse mais evidências, talvez ele estivesse cheio de ar quente. Você executou o teste e obteve o resultado e provou que ele estava errado.
Editar: Do blog de Jeffrey Snover:
A filter is a function that just has a process scriptblock
Isso por si só não é suficiente para me convencer de que um filtro terá uma vantagem de velocidade em relação a uma função, já que ambos têm blocos de processo idênticos.
Além disso, que tipo de equipamento da década de 1950 é esse cara em que leva 4,6 segundos para adicionar um a um número?
PS C:\Users\Ryan> Measure-Command { Filter AddOne { $_ + 1 }; AddOne 1 }
TotalMilliseconds : 7.7266
PS C:\Users\Ryan> Measure-Command { Function AddOne { $_ + 1 }; AddOne 1 }
TotalMilliseconds : 0.4108
4,6 segundos é uma loucura. Talvez o autor estivesse usando algum tipo de versão CTP do Powershell antes que os binários fossem ngeneados. : P
Por fim, tente seu teste em uma nova sessão do Powershell, mas em ordem inversa. Tente a função primeiro e depois o filtro, ou vice-versa:
PS C:\Users\Ryan> Measure-Command { Function AddOne { $_ + 1 }; AddOne 1 }
TotalMilliseconds : 6.597
PS C:\Users\Ryan> Measure-Command { Filter AddOne { $_ + 1 }; AddOne 1 }
TotalMilliseconds : 0.4055
Veja? O primeiro que você executar sempre será mais lento. Foi apenas sobre os internos do .NET de ter carregado coisas na memória que torna a segunda operação mais rápida, independentemente de ser uma função ou um filtro.
Admito que a função ainda parece ser consistentemente mais rápida que o Filter, independentemente de quantas vezes ela é executada.
Measure-Command { Function AddOne($Num) { Return $Num += 1 }; 1..50000 | AddOne $_ }
TotalMilliseconds : 13.9813
Measure-Command { Filter AddOne($Num) { Return $Num += 1 }; 1..50000 | AddOne $_ }
TotalMilliseconds : 69.5301
Então o autor estava errado ... e agora eu não me sinto mal por nunca ter usado um filtro em vez de uma função antes.