Trilhas
/
Lean
Lean
/
Exercícios
/
Frequência de Letras em Paralelo
Frequência de Letras em Paralelo

Frequência de Letras em Paralelo

Médio

Instruções

Conte a frequência das letras em textos usando computação paralela.

O paralelismo consiste em fazer em paralelo coisas que também podem ser feitas de forma sequencial. Um exemplo comum é contar a frequência das letras. Use o paralelismo para calcular a frequência total de cada letra em uma lista de textos.

Tarefas assíncronas

Tarefas são a principal abstração para escrever código assíncrono em Lean. Elas são leves e podem ser executadas em paralelo em outra thread ou de forma concorrente na mesma thread.

Tarefas podem ser puras ou impuras. Tarefas puras são criadas com Task.spawn, que aceita uma computação pura. Tarefas impuras são criadas a partir de computações IO usando, por exemplo, IO.asTask, que eleva um IO α para um Task α dentro da mônada IO.

Neste exercício, a função calculateFrequencies é monádica, retornando um IO (Std.TreeMap Char Nat). Isso permite o uso de tarefas impuras via IO.asTask e também torna possível criar tarefas puras para computações intermediárias antes de retornar o valor final.

Evitando corridas de dados

Por ser uma linguagem funcional, a maioria dos valores em Lean é persistente, ou seja, imutável. Operações que parecem modificar um valor na verdade produzem um novo valor com as alterações solicitadas. Isso significa que a memória muitas vezes pode ser compartilhada com segurança entre tarefas sem introduzir corridas de dados.

Vale notar, no entanto, que nem todas as estruturas de dados são igualmente adequadas ao uso persistente. Por exemplo, atualizar um único elemento de um Array geralmente exige copiar o array inteiro. O mesmo vale para Std.HashSet e Std.HashMap.

Para tornar essas estruturas de dados eficientes, Lean usa contagem de referências. Enquanto um valor tiver uma referência única, as atualizações podem ser feitas de forma destrutiva, evitando cópias desnecessárias.

Outras estruturas de dados, como List, Std.TreeSet e Std.TreeMap, são projetadas para compartilhar estrutura internamente. Elas reutilizam nós inalterados quando atualizações são feitas, de modo que vários valores podem compartilhar referências a esses nós. Como resultado, modificar uma parte da estrutura normalmente não exige copiar o valor inteiro. Isso as torna particularmente adequadas para compartilhamento entre tarefas.

Medindo a velocidade de execução

O tempo de execução de cada teste é medido em nanossegundos usando IO.monoNanosNow e mostrado junto com os resultados. Você pode experimentar abordagens diferentes e conferir o impacto delas no desempenho em tempo de execução.

Editar via GitHub O link abre em uma nova janela ou aba
Lean Exercism

Tudo pronto para começar Frequência de Letras em Paralelo?

Crie sua conta no Exercism para aprender e dominar Lean com 100 exercícios e mentoria humana de verdade, tudo de graça.

Mergulho profundo em Frequência de Letras em Paralelo!

Exploramos as diferenças entre concorrência e paralelismo, vendo as diferentes abordagens adotadas por linguagens como JavaScript, Go, Elixir e Rust.