Descrição

Essa análise tem como objetivo avaliar experimentalmente a diferença de desempenho entre Threads em Java e Goroutines em Go.

Experimento

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.

Conclusões

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.