[Java] Por que certos códigos paralelizados são mais lentos que sequencial?
Considerando o seguinte cenários em Java:
- Temos dois métodos que chamam api's rest
- Um método que chama os 2 em threads separadas e espera os resultados
Exemplo:
public RetornoApi buscaAlgumaCoisa() {
//faz uma request http para buscar alguma coisa
}
public SegundoRetornoApi buscaOutraCoisa() {
//faz outra busca em outra api
}
@Async
public RetornoTratado buscaNasDuasApisERetorna() {
CompletableFuture primeiroRetorno = CompletableFuture
.supplyAsync(() this.buscaAlgumaCoisa());
CompletableFuture segundoRetorno = CompletableFuture
.supplyAsync(() this.buscaOutraCoisa());
CompletableFuture.allOf(primeiroRetorno, segundoRetorno).join();
// retorna o mix dos dois resultados em 1 só.
}
Considere a seguinte configuração de threads no Spring:
@Bean(name = "threadPoolTaskExecutor")
public Executor threadPoolTaskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(10);
executor.setMaxPoolSize(15);
executor.setQueueCapacity(20);
executor.setThreadNamePrefix("MyAsyncThread-");
executor.afterPropertiesSet();
executor.initialize();
return executor;
}
Fazendo as medidas de performance um código mais simples que faz uma chamada de cada vez e retorna o mix dos dois foi mais rapido.
Alguem faz alguma ideia do por que isso acontece?