Executando verificação de segurança...
3

[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?

Carregando publicação patrocinada...
1

Eu não tenho conhecimento profundo em APIs avançadas do Java, mas posso ajudar com algo genérico que eu já respondi antes sobre o fato de threads não garantirem mais velocidade de execução. Em geral as pessoas não entendem bem algo que realmente é complexo e deve ser evitado até que seja necessáio, e é fácil acabar tendo desempenho pior por erro ou porque é impossível fazer algo realmente paralelo (em alguns casos não é bem impossível, mas é muito complicado).

Espero ter ajudado.

Farei algo que muitos pedem para aprender a programar corretamente, gratuitamente. Para saber quando, me segue nas suas plataformas preferidas. Quase não as uso, não terá infindas notificações (links aqui).

1

Isso acontece porque threads não são mágicas. Sempre que for usá-las, existe um custo adicional para gerenciá-las.

O ExecutorService, por exemplo, tem o seu custo, afinal, ele faz todo o trabalho de gerenciar e coordenar as threads, e isso não vem de graça. Esse custo a mais só se paga em certos casos (depende do tipo de tarefa, da quantidade de threads, e de muitos outros fatores).

O link já indicado em outro comentário dá uma explicação bem detalhada disso.