PLINQ
A versatilidade do LINQ com o poder do processamento paraleloA versão 3.0 do .NET Framework introduziu o LINQ como um modelo de consultas unificado para qualquer data source que implemente IEnumerable, dessa forma podemos realizar consultas em coleções de objetos na memória. O Parallel LINQ, ou PLINQ, disponível no .NET Framework 4.0 é capaz de realizar consultas fazendo uso de computação paralela. Ou seja, utilizando processadores multi-core, comuns nos hardwares utilizados nos dias de hoje, podemos programar na plataforma .NET separando uma determinada tarefa de forma a ser executada em pequenas partes rodando concorrentemente (paralelismo na execução de atividades).
Uma consulta PLINQ realiza a mesma implementação do padrão LINQ, mas com paralelismo. Nesse sentido a diferença está na capacidade de utilizar de maneira plena todos os processadores presentes no hardware, particionando a fonte de dados em segmentos e em seguida executando a consulta em cada segmento de forma paralela. Isso pode significar um aumento considerável na performance na maioria dos casos, fazendo com que as consultas sejam executadas rapidamente.
No entanto, o modelo de programação com paralelismo pode introduzir suas próprias complexidades, e nem todas as operações de consulta são executadas com maior velocidade no PLINQ. Veremos nesse artigo como podemos utilizar o PLINQ nos cenários corretos conhecendo suas particularidades, as ferramentas de debugging do Visual Studio 2010 e outras novidades.
Nota: Todos os exemplos foram desenvolvidos com o Visual Studio 2010 Ultimate Beta 2, sendo essa a versão mais recente disponível até o término do artigo. Na sessão de links, no final do artigo, você encontra duas opções de download para o Visual Studio 2010 Ultimate. É possível que para a versão final novos recursos sejam acrescidos tanto ao .NET Framework 4.0 quanto ao Visual Studio 2010, entretanto, neste artigo utilizaremos como referência o material já disponibilizado no MSDN sobre as tecnologias aqui mencionadas.
Programação paralela
O novo modelo de programação com suporte a paralelismo do .NET Framework 4.0 traz uma arquitetura com novas bibliotecas dividas conforme mostra a Figura 1.
Percebemos que além do PLINQ Execution Engine temos a chamada Task Parallel Library (ou simplesmente TPL), responsável por implementar construções com paralelismo – através de For e ForEach – permitindo a execução de tarefas simultâneas. Outra área de destaque no diagrama é a chamada Data Structures for Coordination, que inclui coleções de classes de alta performance e outros objetos leves para sincronização. Complementando o novo modelo de programação, o Visual Studio 2010 traz uma série de novas ferramentas de apoio para debugging e análise das aplicações construídas com parallel programing.
Conforme mencionado na introdução desse artigo, essa nova arquitetura visa tirar proveito dos processadores multi-core, amplamente utilizado em hosts e estações de trabalho. De fato, a tendência é que em pouco tempo os processadores possuam mais núcleos, e as máquinas tenham cada vez mais um poder de processamento maior. Isso significa que aplicações construídas com a nova arquitetura poderão no futuro ser escaladas facilmente.
Para descobrir o número de processadores de um hardware você pode utilizar o código descrito na Listagem 1. Isso pode ser útil em aplicações rodando em máquinas contendo processadores com dois, quatro ou mais núcleos, porque temos como decidir o grau de paralelismo que desejaremos utilizar para executarmos uma determinada tarefa.
Listagem 1. Código para verificação do número de processadores presentes na máquina que executa uma aplicação .NET
1 using System;
2
3 class Program
4 {
5 static void Main()
6 {
7 Console.WriteLine("Número de processadores: {0}",
"