Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Iteração do for e forEach java 8

Achei que tava um pouco lento, primeiro pensei que era minha maquina, depois fui ver o tempo de excecução de cada um, e o forEach do Java 8 é bem mais lento do que o for tradicional, o que fazer?

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class Exercicio {

    public static void main(String[] args) {

        Map<Integer, String> pessoas = new HashMap<>();

        pessoas.put(21, "Leonardo Cordeiro");
        pessoas.put(27, "Fabio Pimentel");
        pessoas.put(19, "Silvio Mattos");
        pessoas.put(23, "Romulo Henrique");

        long ini = System.currentTimeMillis();
        for (Integer key : pessoas.keySet()) {
            System.out.println(key +" - "+ pessoas.get(key));
        }
        long finish = System.currentTimeMillis();
        System.out.println(finish - ini);


        ini = System.currentTimeMillis();
        pessoas.keySet().forEach(idade -> {
            System.out.println(idade +" - "+ pessoas.get(idade));
        });
        finish = System.currentTimeMillis();
        System.out.println(finish - ini);
    }
}

Saida

19 - Silvio Mattos
21 - Leonardo Cordeiro
23 - Romulo Henrique
27 - Fabio Pimentel
Tempo : 4

19 - Silvio Mattos
21 - Leonardo Cordeiro
23 - Romulo Henrique
27 - Fabio Pimentel
Tempo : 743

outro teste...

19 - Silvio Mattos
21 - Leonardo Cordeiro
23 - Romulo Henrique
27 - Fabio Pimentel
Tempo : 1
19 - Silvio Mattos
21 - Leonardo Cordeiro
23 - Romulo Henrique
27 - Fabio Pimentel
Tempo : 189
2 respostas

Bom dia Alexandre,

Como o .forEach() utiliza lambda que vem da programação funcional, provavelmente essa defasagem de performance se dá ao fato da programação funcional usar apenas constantes e muita recursão.

Espero ter ajudado. Abraços.

solução!

Oi, Alexandre!

Tem bastantes textos e discussões sobre isso na internet. Para operações simples e sequenciais como essas, o Stream vai perder certamente. A abordagem do for é mais simples.

Porém, quando se trata de um grande volume de dados e envolvem operações complicadas como sorting e filtering, os benchmarks que foram feitos mostram que a diferença entre usar Stream e for é muito pequena (em alguns casos, o Stream ganha!).

Quando tiver um tempo e mais segurança, tem vários textos que você pode ler (mas são em inglês!)

https://jaxenter.com/java-performance-tutorial-how-fast-are-the-java-8-streams-118830.html

http://blog.codefx.org/java/stream-performance/

https://blog.jooq.org/2015/12/08/3-reasons-why-you-shouldnt-replace-your-for-loops-by-stream-foreach/

http://stackoverflow.com/questions/22658322/java-8-performance-of-streams-vs-collections (comentários!)