Performance Reflection no Java  XML
Índice dos Fóruns » Assuntos gerais (Off-topic)
Autor Mensagem
Marky.Vasconcelos
Moderador
[Avatar]

Membro desde: 11/04/2007 18:18:20
Mensagens: 5932
Localização: São Paulo/SP
Offline

Que Reflection é lento eu sempre soube, mas para testar quão mais lento é, eu executei esse benchmark tosco:



PS: O primeiro teste foi feito sem os System.out.printlns
Eu executei (sem sysouts) esperando que o reflection normal fosse um pouco mais lento que chamadas diretas, e eis que minha surpresa foi:


100000 regular method calls:68 milliseconds.
100000 reflective method calls without lookup:48 milliseconds.
100000 reflective method calls with lookup:168 milliseconds.


Foi então que decedi adicionar os sysouts, por achar que a JVM estava fazendo uma otimização maluca que fizesse o codigo com Reflection ser mais rapido, mas executando, novamente uma surpresa:



//Sem 300000 printlns ;)
100000 regular method calls:1129 milliseconds.
100000 reflective method calls without lookup:910 milliseconds.
100000 reflective method calls with lookup:994 milliseconds.


Observando no topico original de onde tirei o teste (http://www.jguru.com/faq/view.jsp?EID=246569) que mostrava que era duas vezes mais lento, fui decendo nos comentarios, e reparei que com o tempo e novas atualizações na JVM, esse tempo foi diminuindo até que mais recentemente (Java 6_12) acontece o mesmo que eu observei.

Alguém mais pode executar, falar que estou errado, ou responder o que aconteceu que está mais rapido?

E se isso for realmente uma super otimização, por que nos docs do Java (http://download.oracle.com/javase/tutorial/reflect/index.html) ainda exibe:


Performance Overhead
Because reflection involves types that are dynamically resolved, certain Java virtual machine optimizations can not be performed. Consequently, reflective operations have slower performance than their non-reflective counterparts, and should be avoided in sections of code which are called frequently in performance-sensitive applications.

Facebook @MarkyHitchhiker +Mark WP: MarkyTech's

Projects:
Android Roadmap - Aprenda Android do inicio (Java é o unico pre-requisito)
Towel ( ObjectTableModel & Swing & Utils )
Tower Defense Game - Java2D [Open-Source] [How-to-play]
EVGD: Programação de jogos (links) Ponto V! - Desenvolvimento de jogos para indies, curiosos e profissionais

DefaultTableModel?! PARE! Não faça isso! Faça melhor!

Dicas: Faça perguntas inteligentes! ; MigLayout ; GridBagLayout (Joke)

Develop games is fantastic, with words you can make worlds!!!

DON'T PANIC!
MarkyHitchhiker's Blog!
[WWW] [MSN]
entanglement
GUJ Hacker

Membro desde: 26/09/2009 09:18:56
Mensagens: 5750
Offline

Seu benchmark é inválido porque você tem primeiramente de fazer um "warmup" no código, para que a JVM efetue a compilação. Como você não fez isso, qualquer coisa que seja medida primeiro vai parecer que é mais lenta.
Marky.Vasconcelos
Moderador
[Avatar]

Membro desde: 11/04/2007 18:18:20
Mensagens: 5932
Localização: São Paulo/SP
Offline

Agora reparei que o meu problema realmente é o benchmark, executarei separado e verei a diferença.

Facebook @MarkyHitchhiker +Mark WP: MarkyTech's

Projects:
Android Roadmap - Aprenda Android do inicio (Java é o unico pre-requisito)
Towel ( ObjectTableModel & Swing & Utils )
Tower Defense Game - Java2D [Open-Source] [How-to-play]
EVGD: Programação de jogos (links) Ponto V! - Desenvolvimento de jogos para indies, curiosos e profissionais

DefaultTableModel?! PARE! Não faça isso! Faça melhor!

Dicas: Faça perguntas inteligentes! ; MigLayout ; GridBagLayout (Joke)

Develop games is fantastic, with words you can make worlds!!!

DON'T PANIC!
MarkyHitchhiker's Blog!
[WWW] [MSN]
Marky.Vasconcelos
Moderador
[Avatar]

Membro desde: 11/04/2007 18:18:20
Mensagens: 5932
Localização: São Paulo/SP
Offline


100000 regular method calls:70 milliseconds.
100000 reflective method calls without lookup:120 milliseconds.
100000 reflective method calls with lookup:129 milliseconds.


Realmente, reflection é mais lento mesmo, mas mesmo com essa minuscula diferença, acho que ainda vale a pena usa-lo.

Facebook @MarkyHitchhiker +Mark WP: MarkyTech's

Projects:
Android Roadmap - Aprenda Android do inicio (Java é o unico pre-requisito)
Towel ( ObjectTableModel & Swing & Utils )
Tower Defense Game - Java2D [Open-Source] [How-to-play]
EVGD: Programação de jogos (links) Ponto V! - Desenvolvimento de jogos para indies, curiosos e profissionais

DefaultTableModel?! PARE! Não faça isso! Faça melhor!

Dicas: Faça perguntas inteligentes! ; MigLayout ; GridBagLayout (Joke)

Develop games is fantastic, with words you can make worlds!!!

DON'T PANIC!
MarkyHitchhiker's Blog!
[WWW] [MSN]
soaresinfo
JavaEvangelist
[Avatar]

Membro desde: 27/07/2003 15:40:13
Mensagens: 373
Localização: Uberlândia/MG
Offline

entanglement wrote:Seu benchmark é inválido porque você tem primeiramente de fazer um "warmup" no código, para que a JVM efetue a compilação. Como você não fez isso, qualquer coisa que seja medida primeiro vai parecer que é mais lenta.


Mesmo comportamento de banco de dados, a primeira execução leva mais tempo, da segunda em diante o código está compilado e na memória, sendo mais rápido.
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline

Em situações reais, existem outros tipos de otimização que a VM poderá fazer dependendo do contexto, tais como inlining de métodos, cacheamento de resultados, etc. Esse tipo de otimização é raramente feito com o uso de reflection.

De qualquer forma, também acho que a técnica compensa para a maioria dos casos.

Eu só não usaria se fosse no meio de um código computacionalmente intenso, como para definir a função que calcula uma baita malha de polígonos no meio de um jogo
(seria melhor usar reflection para obter um objeto que calcula a malha inteira, fazer o cast para uma interface, e deixar o cálculo em si sem reflexão).

@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline

Marky.Vasconcelos wrote:Agora reparei que o meu problema realmente é o benchmark, executarei separado e verei a diferença.


Melhor ainda. Rode esse código duas ou três vezes num loop, e considere os resultados somente da última execução.
Se vc rodar isoladamente, provavelmente você ainda não verá o que otimizações específicas da VM podem fazer em cada caso.

@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
clone_zealot
JavaEvangelist

Membro desde: 21/11/2004 16:40:00
Mensagens: 424
Offline

Cuidado ao realizar micro benchmarks:
http://www.ibm.com/developerworks/java/library/j-jtp02225/index.html

"Não amo a espada por sua agudez,
não amo a flecha por sua rapidez,
não amo o homem por sua glória,
amo sim, tudo o que eles defendem"
Faramir, Príncipe de Ithilien
juliocbq
GUJ Expert
[Avatar]

Membro desde: 13/11/2008 12:10:18
Mensagens: 3927
Offline

Reflection é útil em coisas simples, para arquitetura de plugins. Não é útil para partes críticas. Eu uso reflection e estou satisfeito com o resultado, mas sei onde posso usá-lo.

www.citrox.com.br
 
Índice dos Fóruns » Assuntos gerais (Off-topic)
Ir para:   
Powered by JForum 2.1.8 © JForum Team