Isso fica mais rápido? Não, claro que não. Isto é mais lento. Adicionando mais threads não faz nada mais rápido. Threads não são mágicas. Se um processador é capaz de fazer um bilhão de operações por segundo, acrescentando outra thread não fará o processador executar outro bilhão de operações por segundo. Em vez disso, ele rouba recursos de outras threads. Se uma moto pode correr a 180 km/hora, pará-la para que outro piloto suba nela não irá tornar a entrega mais rápida! Claramente, em média, as cartas não estão sendo entregues mais rapidamente neste esquema, elas apenas estão sendo entregues em uma ordem diferente.
A analogia com o motoboy foi boa mas está tecnicamente errada ao pensar em um cenário real de um sistema operacional. Pois a moto não está sendo compartilhada somente com os dois motoboys que você contratou, ela está sendo compartilhada com milhares de motoboys que estão trabalhando ao mesmo tempo no sistema operacional.
Digamos que hajam 100 threads ao todo no sistema e 1 para o seu software, o que significa que o seu software usa 1/100 da capacidade do processador. Adicione mais uma thread e agora seu sofware usa 2/101 (2/101 > 1/100
) da capacidade do processador.
Não é o dobro de performance como a galera que não entende de concorrência acha que é, mas existe de fato um ganho de performance. Não é a mesma capacidade sendo dividida por dois igual foi explicado no post. A explicação também não leva em consideração multicore, hyper-threading e a priorização de tarefas do kernel — quanto mais CPU uma thread consome, menos ela é priorizada. Logo dividir o trabalho em dois (ou mais) pode evitar que o processo tenha a performance prejudicada pelo escalonador de tarefas.