Alunos: Carlos Alberto Pamplona Filho / Gabriel Rodrigues Oliveira Lacerda
O objetivo deste trabalho, referente à disciplina de programação concorrente do período de 2023-1, consiste em entender a execução de programas de maneira concorrente na linguagem RUST, e, a partir disso, avaliar a diferença de performance entre algoritmo de bakery e o uso de semáforos como estratégias de implementação das travas, em problemas sem zona crítica (apenas representativa). Para avaliar o desempenho, mediremos os tempos de execução do código a partir de diferentes números de threads, monitorando sua performance.
- Processador CPU de 8 núcleos (4 de desempenho e 4 de eficiência)
- 8 gb memória RAM
- 512 gb dísco (ssd)
Número de Threads | Tempo de execução |
---|---|
2 | 0m0.302s |
4 | 0m0.395s |
6 | 0m0.092s |
16 | 0m0.120s |
32 | 0m0.132s |
64 | 0m0.117s |
128 | 0m0.182s |
256 | 0m0.320s |
512 | 0m1.392s |
1024 | 0m3.955s |
Número de Threads | Tempo de execução |
---|---|
2 | 0m0.095s |
4 | 0m0.095s |
6 | 0m0.106s |
16 | 0m0.112s |
32 | 0m0.198s |
64 | 0m0.166s |
128 | 0m0.464s |
256 | 0m0.375s |
512 | 0m1.425s |
1024 | 0m3.965s |
Gráfico de comparação entre resultados |
---|
- Processador com quatro núcleos físicos e 8 núcleos lógicos.
- 16 GB de memória RAM
- 768.2 GB de disco (ssd)
Número de Threads | Tempo de execução |
---|---|
2 | 0m0,001s |
4 | 0m0,001s |
8 | 0m0,002s |
16 | 0m0,003s |
32 | 0m0,007s |
64 | 0m0,019s |
128 | 0m0,054s |
256 | 0m0,104s |
512 | 0m0,346s |
1024 | 0m1,302s |
Número de Threads | Tempo de execução |
---|---|
2 | 0m0,001s |
4 | 0m0,001s |
8 | 0m0,002s |
16 | 0m0,003s |
32 | 0m0,007s |
64 | 0m0,020s |
128 | 0m0,056s |
256 | 0m0,100s |
512 | 0m0,352s |
1024 | 0m1,316s |
Gráfico de comparação entre resultados |
---|
Durante a pesquisa deste projeto, foi efetuada também uma união de resultados com outro grupo para avaliar a diferença de performance entre diferentes linguagens de programação, a partir de implementações da espera ocupada utilizando o algoritmo de bakery. Nesse caso, reutilizamos nossa implementação em Rust, e a avaliamos contra outra implementação desenvolvida em GO.
A implementação do código em Go foi disponibilizada pela dupla Guilherme Aureliano e Adriano Lira. Ambas as implementações em Go e Rust seguem o mesmo algoritmo de Bakery para controle de concorrência. As estruturas de dados e os mecanismos de sincronização são diferentes nas duas linguagens, refletindo as peculiaridades e as práticas recomendadas por cada uma.
Gráfico de comparação entre resultados |
---|
A partir do observado, é possível notar que o código em GO é menos performático do que o código em RUST à primeira vista. Entretanto o mesmo se mostra mais escalável, tendo uma performance melhor para um número maior de threads.
Durante os experimentos realizados acima descritos, com o código provido, obtivemos um resultado que favorece o algorítmo de bakery sob situações em que temos um número maior de threads (no nosso caso, para uma quantificação de até 1024 valores). Entretanto, ainda assim, obtivemos resultados muito semelhantes, que ficam dentro de uma margem de erro de 5%. Considerando essa mesma margem e o número de threads apresentado, o resultado pode ser considerado equivalente ou muito semelhante.
É importante ressaltar que o projeto é apenas uma breve demonstração da capacidade da linguagem RUST ao lidar com problemas na área da programação concorrente, e incentivamos um aprofundamento de pesquisas nessa área,
BOS, M. In: Rust Atomics and Locks: Low-Level Concurrency in Practice. Primeira Edição. Sebastopol. O’Reilly Media, Inc., 2023.