Oi Alex, tudo bem? Há quanto tempo, hein! :-D
Fiz umas alterações aqui na minha máquina de desenvolvimento (diferente da máquina onde eu gravo o curso), e rodando 20 vezes das duas formas, e aqui estão os resultados.
- Parallel.For: foi mais rápido em 3 rodadas
- Parallel.ForEach: foi mais rápido em 17 rodadas
Parallel.For: Tempo decorrido: 2,674 segundos
Parallel.ForEach: Tempo decorrido: 2,037 segundos
Parallel.For: Tempo decorrido: 2,011 segundos
Parallel.ForEach: Tempo decorrido: 2,113 segundos
Parallel.For: Tempo decorrido: 2,513 segundos
Parallel.ForEach: Tempo decorrido: 1,713 segundos
Parallel.For: Tempo decorrido: 2,514 segundos
Parallel.ForEach: Tempo decorrido: 2,122 segundos
.
.
.
Porém, descobri que ao converter a coleção itens
para List
, o método Parallel.Foreach()
às vezes fica mais lento que o Parallel.For()
:
var itens = Enumerable.Range(0, 100).ToList();
- Parallel.For: foi mais rápido em 14 rodadas
- Parallel.ForEach: foi mais rápido em 6 rodadas
Parallel.For: Tempo decorrido: 2,687 segundos
Parallel.ForEach: Tempo decorrido: 2,522 segundos
Parallel.For: Tempo decorrido: 2,013 segundos
Parallel.ForEach: Tempo decorrido: 2,01 segundos
Parallel.For: Tempo decorrido: 2,513 segundos
Parallel.ForEach: Tempo decorrido: 2,514 segundos
Parallel.For: Tempo decorrido: 2,012 segundos
Parallel.ForEach: Tempo decorrido: 2,014 segundos
.
.
.
O que eu percebi é que a variável itens
original estava sendo instanciada como um objeto RangeIterator
, porém após a modificação ela passa a armazenar um System.Collections.Generic.List
. Pelo visto, o método Foreach()
é mais eficiente sobre o RangeIterator
do que sobre o List
. Então a lição aqui é evitar usar o método .ToList()
em coleções IEnumerable
, a não ser que seja realmente necessário, caso contrário isso pode provocar perdas de desempenho significativas.
Abraços e boa sorte com a certificação!
marcelo