Essa análise tem como objetivo avaliar experimentalmente a diferença de desempenho entre Threads em Java e Goroutines em Go.
Para realizar o experimento dois programas equivalentes foram escritos em Java e em Go. O programa consiste na criação de várias threads/goroutines com o objetivo de analisar o consumo de memória para cada linguagem.
data <- read.csv("./data.csv")
data %>%
rename(memoria_Mb = Memória) %>%
ggplot(aes(x = Threads_Goroutines, y = memoria_Mb, colour = Linguagem)) +
scale_x_log10() +
geom_line() +
xlab("Nº de Threads/Goroutines") +
ylab("Utilização de memória (em Mb)") +
ggtitle("Análise do consumo de memória: Threads x Goroutines")
Observa-se que a medida que o número de goroutines aumenta, há pouca variação na utilização de memória. Considerando a mesma quantidade de threads em Java, o consumo de memória apresenta um crescimento muito maior. Isso mostra que para um programa que necessita de muitas partes executando concorrentemente, a utilização de Go fornece resultados mais eficientes para a utilização de memória.
O resultado do experimento mostra que goroutines são mais leves do que threads. Entretanto, é importante dizer que goroutines não são threads, já que essas rotinas são mantidas pelo runtime do próprio Go e não pelo SO. As threads criadas em Java são mapeadas diretamente para threads do SO, enquanto o runtime de Go combina diversas goroutines em um número menor de threads do SO, fazendo com que o consumo de recursos seja reduzido.