Pq Lambdas são tão lentas em relação a instância convencional?
8 respostas
Alysson_Alves1
Alguém pode me dizer o processo por trás disso que torna o processamento tão lento?
Pq o mesmo não acontece com classe anônimas? Vale apena abrir mão dessa diferença pra deixar o projeto mais limpo? Não sei se o método que usei pra checar essa diferença é preciso
Pode postar o código completo (em texto, não imagens)? Tanto do Runnable lambda quanto do código com classes anônimas. Pois, sem ver tudo o que seu código está fazendo, é difícil tentar explicar a causa dessa diferença.
Abraço.
Alysson_Alves1
packagePrincipal;publicclassMeuPrograma{publicstaticvoidmain(String[]args)throwsInterruptedException{doubleinicio=System.currentTimeMillis();//Runnable r= newThread(()->{doublein=System.currentTimeMillis();for(inti=0;i<10000;){i++;}System.out.println(((((double)System.currentTimeMillis()-in)/1000))+"segundos pra rodar o lambda");}).start();System.out.println(((((double)System.currentTimeMillis()-inicio)/1000))+"segundos pra carregar o labda");// for(int i=0;i<100;) {// i++;// }//System.out.println(thread.getName());}}
lambdas(esse está inserido direto no construtor do thread)
Alysson_Alves1
packagePrincipal;publicclassMeuPrograma{publicstaticvoidmain(String[]args)throwsInterruptedException{doubleinicio=System.currentTimeMillis();Runnabler=newRunnable(){@Overridepublicvoidrun(){// TODO Auto-generated method stub}};// new Thread(()-> { double in=System.currentTimeMillis();// // for(int i=0;i<10000;) {// i++; // }// System.out.println(((((double)System.currentTimeMillis()-in)/1000))+"segundos pra rodar o lambda");// // }).start();System.out.println(((((double)System.currentTimeMillis()-inicio)/1000))+"segundos pra carregar o labda");// for(int i=0;i<100;) {// i++;// }//System.out.println(thread.getName());}}
Classes anônimas
Alysson_Alves1
mas no geral é só isso mesmo, ele só carrega isso. fiz alguns processos e cronometrei em cada ponto, mas onde tá a maior diferença é na hora de gera o lambda
TerraSkilll1 like
Esse código está funcional (ou seja, roda normalmente)? Se sim, tente colocá-lo no Ideone, para vermos rodando.
O método run do seu Runnable não faz nada, e o Runnable em si não é usado em parte alguma. Não diria que esses códigos são equivalentes, então comparar o tempo de cada um não parece correto.
Pode ser que exista mesmo um custo ligeiramente maior em usar lambda, pois são coisas distintas na JVM. Fiz um teste grosseiro (estou enferrujado em Java) e, apesar de haver uma diferença, não a achei tão significativa. Veja neste link: https://ideone.com/36wEdq
Abraço.
Alysson_Alves1
o run não faz nada de propósito, ele precisava ser declarado por implementar Runnable. fiz o esse lambda sem método só pra ver se o tempo era alterado pra executar o método dentro do lambda, mas como pode ver só de declarar o lambda ele da esse delay.
j-menezes1 like
Isso mostra que nem todo código que é menor e limpinho necessariamente seja mais rápido ou até mesmo igual.
pmlm1 like
Se rodares várias vezes (na mesma execução) irás ver que essa lentidão só ocorre na primeira vez.