Avaliação de concorrência e sincronização de diferentes linguagens de programação populares
| Main Author: | |
|---|---|
| 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 |