Aprimorado para desempenho de loop pior do que a pesquisa indexada tradicional?

Acabei de encontrar este comentário aparentemente inócuo , comparando ArrayList com um array String bruto. É de alguns anos atrás, mas o OP escreve

Notei que usar for String s: stringsList era cerca de 50% mais lento do que usar um loop for antigo para acessar a lista. Vai entender ...

Ninguém comentou sobre isso no post original, e o teste parecia um pouco duvidoso (muito curto para ser preciso), mas quase caí da cadeira quando li. Eu nunca comparei um loop aprimorado com um "tradicional", mas atualmente estou trabalhando em um projeto que faz centenas de milhões de iterações em instâncias de ArrayList usando loops aprimorados, então isso é uma preocupação para mim.

Vou fazer um benchmarking e postar minhas descobertas aqui, mas isso é obviamente uma grande preocupação para mim. Pude encontrar poucas informações preciosas online sobre desempenho relativo, exceto por algumas menções improvisadas de que loops aprimorados para ArrayLists rodam muito mais devagar no Android .

Alguém já experimentou isso? Essa lacuna de desempenho ainda existe? Vou postar minhas descobertas aqui, mas fiquei muito surpreso ao ler. Suspeito que, se essa lacuna de desempenho existisse, ela foi corrigida em VMs mais modernas, mas acho que agora terei que fazer alguns testes e confirmar.

Atualização: Fiz algumas alterações em meu código, mas já estava suspeitando do que outros aqui já apontaram: com certeza o loop for aprimorado é mais lento, mas fora de loops apertados muito triviais, o custo deve ser uma fração minúscula do custo da lógica do loop. No meu caso, embora eu esteja iterando em listas muito grandes de strings usando loops aprimorados, minha lógica dentro do loop é complexa o suficiente que eu não pude nem medir a diferença depois de mudar para loops baseados em índice.

DR: loops aprimorados são de fato mais lentos do que um loop tradicional baseado em índice em um arraylist; mas, para a maioria das aplicações, a diferença deve ser insignificante.

10
задан Community 23 May 2017 в 10:26
поделиться