Avaliação de concorrência e sincronização de diferentes linguagens de programação populares

Bibliographic Details
Main Author: Pereira, Felipe Zorzo
Publication Date: 2021
Format: Bachelor thesis
Language: eng
Source: Repositório Institucional da UFRGS
Download full: http://hdl.handle.net/10183/223221
Summary: Concorrência é um conceito essencial para a escrita de programas reativos, rápidos e interativos. Atualmente, entretanto, existe uma grande quantidade de linguagens de programação que oferecem mecanismos de concorrência. A partir daí surge o objetivo desse trabalho: realizar uma avaliação sistemática de mecanismos de concorrência e sincronização de algumas das mais populares linguagens de programação de propósito geral, a fim de ajudar programadores a fazerem decisões informadas sobre quais linguagens melhor se adequam às suas necessidades de concorrência. As linguagens analisadas nesse trabalho são C++, Go, Java, Kotlin e Scala. A avaliação delas é feita com base em dados obtidos sobre as métricas de overhead da concorrência e da sincronização, speedup e justiça. Tais dados foram coletados por meio da execução de programas implementados usando as linguagens e os seus mecanismos. Para analisar os overheads simplesmente se comparou o desempenho de laços vazios e de laços que criam tarefas concorrentes ou entram e saem de seções críticas; para o speedup implementou-se a multiplicação de matrizes; por fim, para a justiça foi utilizado o problema dos filósofos. Os programas foram executados em duas máquinas com processadores e sistemas operacionais distintos, a fim de confirmar que as conclusões obtidas não são dependentes da plataforma utilizada. Os resultados demonstram que as linguagens com menos overhead de concorrência foram Go e Kotlin, com Scala ficando muito atrás das demais linguagens. Os overheads de sincronização de todas as linguagens são extremamente baixos, sendo aceitáveis para a grande maioria das aplicações; apesar disso, Scala ficou bem atrás das demais linguagens. Quanto ao speedup, considera-se que as threads de Java obtiveram os resultados mais constantes ao longo dos experimentos nas duas máquinas. Os experimentos para avaliar a justiça das linguagens obtiveram resultados bem esparsos, sendo difícil escolher uma linguagem como sendo a melhor. Entretanto, Java, assim como as linguagens baseadas em Java (Scala e Kotlin), se destacaram. Por fim, conclui-se que Java e Kotlin foram as linguagens com os melhores resultados gerais. Se o maior objetivo da concorrência é proporcionar speedup, recomenda-se Java; se, por outro lado, o programa exige a criação de dezenas ou centenas de milhares de tarefas concorrentes, recomenda-se Kotlin.
id UFRGS-2_ce63d927d6f0048bbbe7efcb1589597c
oai_identifier_str oai:www.lume.ufrgs.br:10183/223221
network_acronym_str UFRGS-2
network_name_str Repositório Institucional da UFRGS
repository_id_str
spelling Pereira, Felipe ZorzoGeyer, Claudio Fernando Resin2021-07-06T04:46:00Z2021http://hdl.handle.net/10183/223221001126941Concorrência é um conceito essencial para a escrita de programas reativos, rápidos e interativos. Atualmente, entretanto, existe uma grande quantidade de linguagens de programação que oferecem mecanismos de concorrência. A partir daí surge o objetivo desse trabalho: realizar uma avaliação sistemática de mecanismos de concorrência e sincronização de algumas das mais populares linguagens de programação de propósito geral, a fim de ajudar programadores a fazerem decisões informadas sobre quais linguagens melhor se adequam às suas necessidades de concorrência. As linguagens analisadas nesse trabalho são C++, Go, Java, Kotlin e Scala. A avaliação delas é feita com base em dados obtidos sobre as métricas de overhead da concorrência e da sincronização, speedup e justiça. Tais dados foram coletados por meio da execução de programas implementados usando as linguagens e os seus mecanismos. Para analisar os overheads simplesmente se comparou o desempenho de laços vazios e de laços que criam tarefas concorrentes ou entram e saem de seções críticas; para o speedup implementou-se a multiplicação de matrizes; por fim, para a justiça foi utilizado o problema dos filósofos. Os programas foram executados em duas máquinas com processadores e sistemas operacionais distintos, a fim de confirmar que as conclusões obtidas não são dependentes da plataforma utilizada. Os resultados demonstram que as linguagens com menos overhead de concorrência foram Go e Kotlin, com Scala ficando muito atrás das demais linguagens. Os overheads de sincronização de todas as linguagens são extremamente baixos, sendo aceitáveis para a grande maioria das aplicações; apesar disso, Scala ficou bem atrás das demais linguagens. Quanto ao speedup, considera-se que as threads de Java obtiveram os resultados mais constantes ao longo dos experimentos nas duas máquinas. Os experimentos para avaliar a justiça das linguagens obtiveram resultados bem esparsos, sendo difícil escolher uma linguagem como sendo a melhor. Entretanto, Java, assim como as linguagens baseadas em Java (Scala e Kotlin), se destacaram. Por fim, conclui-se que Java e Kotlin foram as linguagens com os melhores resultados gerais. Se o maior objetivo da concorrência é proporcionar speedup, recomenda-se Java; se, por outro lado, o programa exige a criação de dezenas ou centenas de milhares de tarefas concorrentes, recomenda-se Kotlin.Concurrency is an essential concept to the writing of reactive, fast and interactive programs. Nowadays, however, a great variety of programming languages offers concurrency mechanisms. From this emerges the objective of this work: to perform a systematic evaluation of concurrency and synchronization mechanisms of some of the most popular general-purpose programming languages, in order to help programmers make informed decisions on which languages best suit their needs for concurrency. The languages analyzed in this work are C++, Go, Java, Kotlin and Scala. Their evaluation is done based on data collected about their overhead, speedup and fairness. This data was collected through the execution of programs implemented using the languages and their mechanisms. To analyze the overhead of the languages, empty loops were compared to loops that create concurrent tasks or enter and leave critical sections; to analyze the speedup, matrix multiplication was implemented; lastly, the dining philosophers problem was used to analyze the fairness of the languages. The programs were executed in two different machines with different processors and operating systems, with the intention of confirming that the conclusions obtained are not dependent on the underlying platform. The results show that the languages with the least concurrency overhead are Go and Kotlin, with Scala's performance being way behind the other languages. The synchronization overhead of all the languages is extremely low, being acceptable to the majority of applications; Scala, however, stood way behind the other languages once again. Regarding the speedup it is considered that Java's threads had the most consistent results during the experiments on both machines. The experiments that evaluate the languages' fairness had very sparse results. Therefore, it is difficult to choose one language as the fairest. Despite of that, Java, as well as the Java-based languages (Scala and Kotlin), stood out. Finally, it is concluded that Java and Kotlin were the languages with the best overall results. If the main objective of concurrency is speedup, Java is recommended; if, on the other hand, the program requires the creation of dozens or hundreds of thousands of concurrency tasks, Kotlin is recommended.application/pdfengLinguagens de programaçãoSincronizacaoParalelismoThreadsConcorrênciaC++GoJavaKotlinScalaGoroutinesCoroutinesMutexSpeedupAvaliação de concorrência e sincronização de diferentes linguagens de programação popularesConcurrency and synchronization evaluation of different programming languages info:eu-repo/semantics/publishedVersioninfo:eu-repo/semantics/bachelorThesisUniversidade Federal do Rio Grande do SulInstituto de InformáticaPorto Alegre, BR-RS2020Ciência da Computação: Ênfase em Ciência da Computação: Bachareladograduaçãoinfo:eu-repo/semantics/openAccessreponame:Repositório Institucional da UFRGSinstname:Universidade Federal do Rio Grande do Sul (UFRGS)instacron:UFRGSTEXT001126941.pdf.txt001126941.pdf.txtExtracted Texttext/plain126590http://www.lume.ufrgs.br/bitstream/10183/223221/2/001126941.pdf.txta4d23bc1029a700ab687354fef104735MD52ORIGINAL001126941.pdfTexto completoapplication/pdf2474788http://www.lume.ufrgs.br/bitstream/10183/223221/1/001126941.pdfc77222bcee317655f58613496a2c564aMD5110183/2232212024-04-03 06:43:10.584177oai:www.lume.ufrgs.br:10183/223221Repositório InstitucionalPUBhttps://lume.ufrgs.br/oai/requestlume@ufrgs.bropendoar:2024-04-03T09:43:10Repositório Institucional da UFRGS - Universidade Federal do Rio Grande do Sul (UFRGS)false
dc.title.pt_BR.fl_str_mv Avaliação de concorrência e sincronização de diferentes linguagens de programação populares
dc.title.alternative.pt.fl_str_mv Concurrency and synchronization evaluation of different programming languages
title Avaliação de concorrência e sincronização de diferentes linguagens de programação populares
spellingShingle Avaliação de concorrência e sincronização de diferentes linguagens de programação populares
Pereira, Felipe Zorzo
Linguagens de programação
Sincronizacao
Paralelismo
Threads
Concorrência
C++
Go
Java
Kotlin
Scala
Goroutines
Coroutines
Mutex
Speedup
title_short Avaliação de concorrência e sincronização de diferentes linguagens de programação populares
title_full Avaliação de concorrência e sincronização de diferentes linguagens de programação populares
title_fullStr Avaliação de concorrência e sincronização de diferentes linguagens de programação populares
title_full_unstemmed Avaliação de concorrência e sincronização de diferentes linguagens de programação populares
title_sort Avaliação de concorrência e sincronização de diferentes linguagens de programação populares
author Pereira, Felipe Zorzo
author_facet Pereira, Felipe Zorzo
author_role author
dc.contributor.author.fl_str_mv Pereira, Felipe Zorzo
dc.contributor.advisor1.fl_str_mv Geyer, Claudio Fernando Resin
contributor_str_mv Geyer, Claudio Fernando Resin
dc.subject.por.fl_str_mv Linguagens de programação
Sincronizacao
Paralelismo
Threads
Concorrência
topic Linguagens de programação
Sincronizacao
Paralelismo
Threads
Concorrência
C++
Go
Java
Kotlin
Scala
Goroutines
Coroutines
Mutex
Speedup
dc.subject.eng.fl_str_mv C++
Go
Java
Kotlin
Scala
Goroutines
Coroutines
Mutex
Speedup
description Concorrência é um conceito essencial para a escrita de programas reativos, rápidos e interativos. Atualmente, entretanto, existe uma grande quantidade de linguagens de programação que oferecem mecanismos de concorrência. A partir daí surge o objetivo desse trabalho: realizar uma avaliação sistemática de mecanismos de concorrência e sincronização de algumas das mais populares linguagens de programação de propósito geral, a fim de ajudar programadores a fazerem decisões informadas sobre quais linguagens melhor se adequam às suas necessidades de concorrência. As linguagens analisadas nesse trabalho são C++, Go, Java, Kotlin e Scala. A avaliação delas é feita com base em dados obtidos sobre as métricas de overhead da concorrência e da sincronização, speedup e justiça. Tais dados foram coletados por meio da execução de programas implementados usando as linguagens e os seus mecanismos. Para analisar os overheads simplesmente se comparou o desempenho de laços vazios e de laços que criam tarefas concorrentes ou entram e saem de seções críticas; para o speedup implementou-se a multiplicação de matrizes; por fim, para a justiça foi utilizado o problema dos filósofos. Os programas foram executados em duas máquinas com processadores e sistemas operacionais distintos, a fim de confirmar que as conclusões obtidas não são dependentes da plataforma utilizada. Os resultados demonstram que as linguagens com menos overhead de concorrência foram Go e Kotlin, com Scala ficando muito atrás das demais linguagens. Os overheads de sincronização de todas as linguagens são extremamente baixos, sendo aceitáveis para a grande maioria das aplicações; apesar disso, Scala ficou bem atrás das demais linguagens. Quanto ao speedup, considera-se que as threads de Java obtiveram os resultados mais constantes ao longo dos experimentos nas duas máquinas. Os experimentos para avaliar a justiça das linguagens obtiveram resultados bem esparsos, sendo difícil escolher uma linguagem como sendo a melhor. Entretanto, Java, assim como as linguagens baseadas em Java (Scala e Kotlin), se destacaram. Por fim, conclui-se que Java e Kotlin foram as linguagens com os melhores resultados gerais. Se o maior objetivo da concorrência é proporcionar speedup, recomenda-se Java; se, por outro lado, o programa exige a criação de dezenas ou centenas de milhares de tarefas concorrentes, recomenda-se Kotlin.
publishDate 2021
dc.date.accessioned.fl_str_mv 2021-07-06T04:46:00Z
dc.date.issued.fl_str_mv 2021
dc.type.status.fl_str_mv info:eu-repo/semantics/publishedVersion
dc.type.driver.fl_str_mv info:eu-repo/semantics/bachelorThesis
format bachelorThesis
status_str publishedVersion
dc.identifier.uri.fl_str_mv http://hdl.handle.net/10183/223221
dc.identifier.nrb.pt_BR.fl_str_mv 001126941
url http://hdl.handle.net/10183/223221
identifier_str_mv 001126941
dc.language.iso.fl_str_mv eng
language eng
dc.rights.driver.fl_str_mv info:eu-repo/semantics/openAccess
eu_rights_str_mv openAccess
dc.format.none.fl_str_mv application/pdf
dc.source.none.fl_str_mv reponame:Repositório Institucional da UFRGS
instname:Universidade Federal do Rio Grande do Sul (UFRGS)
instacron:UFRGS
instname_str Universidade Federal do Rio Grande do Sul (UFRGS)
instacron_str UFRGS
institution UFRGS
reponame_str Repositório Institucional da UFRGS
collection Repositório Institucional da UFRGS
bitstream.url.fl_str_mv http://www.lume.ufrgs.br/bitstream/10183/223221/2/001126941.pdf.txt
http://www.lume.ufrgs.br/bitstream/10183/223221/1/001126941.pdf
bitstream.checksum.fl_str_mv a4d23bc1029a700ab687354fef104735
c77222bcee317655f58613496a2c564a
bitstream.checksumAlgorithm.fl_str_mv MD5
MD5
repository.name.fl_str_mv Repositório Institucional da UFRGS - Universidade Federal do Rio Grande do Sul (UFRGS)
repository.mail.fl_str_mv lume@ufrgs.br
_version_ 1834472268123602944