| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/03/2011 12:30:46
|
Mikhas
Virtual Machine Man
![[Avatar]](/images/avatar/4388a23da67b154b780b78dd7ea4636e.jpg)
Membro desde: 17/06/2008 11:10:50
Mensagens: 677
Localização: São Paulo
Offline
|
Reflector 1.5.4
Olá galera malandra!
É com humildade que venho apresentar a vocês a bibliotéca que criei: Reflector.
Como é de se adivinhar, o Reflector é uma biblioteca que criei para facilitar a utilização do Reflection API.
Ao desenvolve-la, tive como foco facilidade de uso e performance.
Download
Pequena referencia
Maven
Estou aberto a comentários e sugestões!
Grato pela sua atenção.
Atenção:
Quem baixou a versão 1.5.3, atualize para a nova versão 1.5.4 devida a uma correção referente a chamada nativa de métodos.
Grato
|
| Nome do arquivo |
reflector-performance.png |
Download
|
| Descrição |
Comparação de performance Reflector |
| Tamanho |
10 Kbytes
|
| Baixado: |
86 vez(es) |
This message was edited 2 times. Last update was at 28/03/2011 13:04:30
|
Refractor 1.6 - Easy reflection framework
Agora muito mais rapido!
Raze - The fastest CSS selector engine
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/03/2011 12:32:11
|
Marky.Vasconcelos
Moderador
![[Avatar]](/images/avatar/04940fadf3702cbd84b7a48161037c4f.png)
Membro desde: 11/04/2007 18:18:20
Mensagens: 5932
Localização: São Paulo/SP
Offline
|
1° No site se chama Refractor e voce apresenta como Reflector??
2° Como voce deixou mais rapido que a propria API de Reflection? Voce usa alguma bytecode lib?
|
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! |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/03/2011 12:41:11
|
j0nny
GUJ Master
![[Avatar]](/images/avatar/2f37ce1ace06a770fab4452db0fe5c5f.png)
Membro desde: 19/09/2009 00:01:57
Mensagens: 1121
Localização: Blumenau - SC
Offline
|
Marky.Vasconcelos wrote:1° No site se chama Refractor e voce apresenta como Reflector??
2° Como voce deixou mais rapido que a propria API de Reflection? Voce usa alguma bytecode lib?
Minhas pergunta é a mesma da segunda do Marky
|
@jntsdaniel
github.com/jonatasdaniel
---
AndOrm - Framework ORM para Android
http://github.com/jonatasdaniel/andorm |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/03/2011 12:58:53
|
Mikhas
Virtual Machine Man
![[Avatar]](/images/avatar/4388a23da67b154b780b78dd7ea4636e.jpg)
Membro desde: 17/06/2008 11:10:50
Mensagens: 677
Localização: São Paulo
Offline
|
j0nny wrote:
Marky.Vasconcelos wrote:1° No site se chama Refractor e voce apresenta como Reflector??
2° Como voce deixou mais rapido que a propria API de Reflection? Voce usa alguma bytecode lib?
Minhas pergunta é a mesma da segunda do Marky
1º Mudei o nome da biblioteca mas não consegui renomear a pagina
2º Utilizo javassist e algumas funções internas da JVM e do JDK quando possivel
This message was edited 1 time. Last update was at 23/03/2011 12:59:18
|
Refractor 1.6 - Easy reflection framework
Agora muito mais rapido!
Raze - The fastest CSS selector engine
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/03/2011 13:00:32
|
j0nny
GUJ Master
![[Avatar]](/images/avatar/2f37ce1ace06a770fab4452db0fe5c5f.png)
Membro desde: 19/09/2009 00:01:57
Mensagens: 1121
Localização: Blumenau - SC
Offline
|
Mikhas wrote:
j0nny wrote:
Marky.Vasconcelos wrote:1° No site se chama Refractor e voce apresenta como Reflector??
2° Como voce deixou mais rapido que a propria API de Reflection? Voce usa alguma bytecode lib?
Minhas pergunta é a mesma da segunda do Marky
1º Mudei o nome da biblioteca mas não consegui renomear a pagina
2º Utilizo javassist e algumas funções internas da JVM e do JDK quando possivel 
Será que com a Dalvik do Android o desempenho será tao satisfatório assim também?
Pois estou quase liberando a primeira versão do AndOrm, com as funções básicas.
PS: Pq não coloca no GitHub? Fica mais fácil e legal do pessoal contribuir
This message was edited 1 time. Last update was at 23/03/2011 13:01:32
|
@jntsdaniel
github.com/jonatasdaniel
---
AndOrm - Framework ORM para Android
http://github.com/jonatasdaniel/andorm |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/03/2011 13:04:01
|
Mikhas
Virtual Machine Man
![[Avatar]](/images/avatar/4388a23da67b154b780b78dd7ea4636e.jpg)
Membro desde: 17/06/2008 11:10:50
Mensagens: 677
Localização: São Paulo
Offline
|
j0nny wrote:
Mikhas wrote:
j0nny wrote:
Marky.Vasconcelos wrote:1° No site se chama Refractor e voce apresenta como Reflector??
2° Como voce deixou mais rapido que a propria API de Reflection? Voce usa alguma bytecode lib?
Minhas pergunta é a mesma da segunda do Marky
1º Mudei o nome da biblioteca mas não consegui renomear a pagina
2º Utilizo javassist e algumas funções internas da JVM e do JDK quando possivel 
Será que com a Dalvik do Android o desempenho será tao satisfatório assim também?
Pois estou quase liberando a primeira versão do AndOrm, com as funções básicas.
PS: Pq não coloca no GitHub? Fica mais fácil e legal do pessoal contribuir
Creio que no Android ele não utilizará as features "mothafocka" deixando a performance semelhante a da API padrão.
É que eu já uso SVN e estou acostumado. Sem falar que uso Windows.
|
Refractor 1.6 - Easy reflection framework
Agora muito mais rapido!
Raze - The fastest CSS selector engine
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/03/2011 13:06:20
|
j0nny
GUJ Master
![[Avatar]](/images/avatar/2f37ce1ace06a770fab4452db0fe5c5f.png)
Membro desde: 19/09/2009 00:01:57
Mensagens: 1121
Localização: Blumenau - SC
Offline
|
Mikhas wrote:
j0nny wrote:
Mikhas wrote:
j0nny wrote:
Marky.Vasconcelos wrote:1° No site se chama Refractor e voce apresenta como Reflector??
2° Como voce deixou mais rapido que a propria API de Reflection? Voce usa alguma bytecode lib?
Minhas pergunta é a mesma da segunda do Marky
1º Mudei o nome da biblioteca mas não consegui renomear a pagina
2º Utilizo javassist e algumas funções internas da JVM e do JDK quando possivel 
Será que com a Dalvik do Android o desempenho será tao satisfatório assim também?
Pois estou quase liberando a primeira versão do AndOrm, com as funções básicas.
PS: Pq não coloca no GitHub? Fica mais fácil e legal do pessoal contribuir
Creio que no Android ele não utilizará as features "mothafocka" deixando a performance semelhante a da API padrão.
É que eu já uso SVN e estou acostumado. Sem falar que uso Windows.
Ah ok, então nem valeria a pena. MASSS, vou fazer um teste a parte mais tarde para comprovar
Tbm usava SVN e Windows, agora uso Ubuntu e GitHub para projetos pessoais, e Ubuntu e SVN profissionalmente.
|
@jntsdaniel
github.com/jonatasdaniel
---
AndOrm - Framework ORM para Android
http://github.com/jonatasdaniel/andorm |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/03/2011 13:07:28
|
asaudate
GUJ Master
![[Avatar]](/images/avatar/974e2945a18e0bfb8e3aa8becac3e65c.jpg)
Membro desde: 01/09/2007 19:31:41
Mensagens: 1794
Localização: São Paulo
Offline
|
Mikhas wrote:
j0nny wrote:
Mikhas wrote:
j0nny wrote:
Marky.Vasconcelos wrote:1° No site se chama Refractor e voce apresenta como Reflector??
2° Como voce deixou mais rapido que a propria API de Reflection? Voce usa alguma bytecode lib?
Minhas pergunta é a mesma da segunda do Marky
1º Mudei o nome da biblioteca mas não consegui renomear a pagina
2º Utilizo javassist e algumas funções internas da JVM e do JDK quando possivel 
Será que com a Dalvik do Android o desempenho será tao satisfatório assim também?
Pois estou quase liberando a primeira versão do AndOrm, com as funções básicas.
PS: Pq não coloca no GitHub? Fica mais fácil e legal do pessoal contribuir
Creio que no Android ele não utilizará as features "mothafocka" deixando a performance semelhante a da API padrão.
É que eu já uso SVN e estou acostumado. Sem falar que uso Windows.
Dá pra usar sossegado o GitHub usando TortoiseGit. Só muda mesmo o estilo, que é um pouco diferente do SVN.
[]´s
|
Alexandre Saudate
__________________________
Do not try to bend the spoon - that's impossible. Instead, only try to realize the truth: there is no spoon.
Série quickstart: Spring+Spring Security+Jersey (REST) +Hibernate (JPA) -> https://github.com/alesaudate/kickstart-springjerseyhibernate
Evite usar Axis2!!! Leia aqui para mais detalhes!
@alesaudate
Quer ler um blog especializado em web services e SOA?
 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/03/2011 13:13:03
|
jonasabreu
Debugger
![[Avatar]](/images/avatar/54d97d6613bb7ac9f94dc4619a06310b.jpg)
Membro desde: 17/09/2007 18:42:58
Mensagens: 52
Offline
|
Olá Mikhas,
Boa iniciativa! Não achei que o Mirror estivesse com a performance tão ruim para reflection. Você pode disponibilizar o benchmark para eu dar uma olhada? O problema deve estar no lookup do método.
De qualquer forma parece que está bem simples de usar. Gostei da API (Tirando que o acesso a ela é via métodos static, mas se seu foco é performance, acho que faz sentido.)
Algumas perguntas porque ainda não tive tempo de olhar bem o código
1 - É Thread-safe?
2 - Os truques para acelerar envolvem sun.misc.Unsafe e sun.reflect.*Accessor? Ou você encontrou algo ainda mais baixo?
3 - Javassist para analize do bitecode certo? Você chegou a medir os ganhos de performance? Eu estava pensando em fazer isso pro Mirror, mas se já tiver dados melhor ainda
|
Mirror DSL - Reflection de forma simples - http://projetos.vidageek.net/mirror-pt
VidaGeek.net - http://vidageek.net |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/03/2011 13:29:51
|
Mikhas
Virtual Machine Man
![[Avatar]](/images/avatar/4388a23da67b154b780b78dd7ea4636e.jpg)
Membro desde: 17/06/2008 11:10:50
Mensagens: 677
Localização: São Paulo
Offline
|
jonasabreu wrote:Olá Mikhas,
Boa iniciativa! Não achei que o Mirror estivesse com a performance tão ruim para reflection. Você pode disponibilizar o benchmark para eu dar uma olhada? O problema deve estar no lookup do método.
De qualquer forma parece que está bem simples de usar. Gostei da API  (Tirando que o acesso a ela é via métodos static, mas se seu foco é performance, acho que faz sentido.)
Algumas perguntas porque ainda não tive tempo de olhar bem o código
1 - É Thread-safe?
2 - Os truques para acelerar envolvem sun.misc.Unsafe e sun.reflect.*Accessor? Ou você encontrou algo ainda mais baixo?
3 - Javassist para analize do bitecode certo? Você chegou a medir os ganhos de performance? Eu estava pensando em fazer isso pro Mirror, mas se já tiver dados melhor ainda 
Não fiz testes com varias threads, só testes funcionais, mas acredito que tem haverá muitos problemas pois os proxies possuem em sua maioria atributos finais.
Eu utilizo o Unsafe quando possivel e o javassist para criar proxies também. Não o utilizei para analize de bytecode já que nunca vi isso na vida... mas esta ai uma coisa para correr atrás.
O teste de performance que fiz é bem simples na verdade:
ReflectorPerformanceTest
Tentei ser o mais just possivel com todas as API's.
|
Refractor 1.6 - Easy reflection framework
Agora muito mais rapido!
Raze - The fastest CSS selector engine
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/03/2011 13:35:39
|
garcia-jj
JWizard
Membro desde: 13/04/2009 22:11:50
Mensagens: 2715
Localização: Porto Alegre
Offline
|
O tópico está duplicado. Há outro igual no sub-forum para projetos brasileiros.
A iniciativa é boa, a documentação está bem clara e tem uma boa wiki (bem simplese direta).
Mas não gostei de ter uma javassist embedded por dois motivos: o jar fica grande, e isso pode ocasionar classloader hell caso o usuário tenha outra versão do javassist. Meu conselho é não usar assim ou renomear de javassist.* para br.mikhas.reflector.*, que é o que o pessoal faz quando distribui coisas embedded.
Na classe principal há um map que guarda um cache dos proxies criados pelo Javassist. É bom cuidar com essas coisas staticas, pois não são thread-safe.
Eu fiquei mesmo impressionado com o gráfico. Ser mais rápido que o Mirror ou outra lib semelhante pode ser, mas ser mais rápido que o JDK, só se usar cache. Mas isso por outro lado é perigoso por causa do acumulo de memoria e também com o cuidado de guardar esse cache thread-safe.
|
http://github.com/garcia-jj
Não respondo dúvidas via MP. Use o fórum. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/03/2011 13:41:57
|
jonasabreu
Debugger
![[Avatar]](/images/avatar/54d97d6613bb7ac9f94dc4619a06310b.jpg)
Membro desde: 17/09/2007 18:42:58
Mensagens: 52
Offline
|
@garcia-jj
Usando classes internas da VM dá pra ser consideravelmente mais rápido que a VM pois você consegue ignorar várias checagens de segurança. Além de que no caso de fields, você consegue acesso direto à memória usando o sun.misc.Unsafe.
|
Mirror DSL - Reflection de forma simples - http://projetos.vidageek.net/mirror-pt
VidaGeek.net - http://vidageek.net |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/03/2011 13:44:11
|
garcia-jj
JWizard
Membro desde: 13/04/2009 22:11:50
Mensagens: 2715
Localização: Porto Alegre
Offline
|
jonasabreu wrote:@garcia-jj
Usando classes internas da VM dá pra ser consideravelmente mais rápido que a VM pois você consegue ignorar várias checagens de segurança. Além de que no caso de fields, você consegue acesso direto à memória usando o sun.misc.Unsafe.
]
Hmm, muito interessante. Eu ví isso se não me engano no Objenesis, onde há algumas implementações usando recursos internos específicas das VMs.
|
http://github.com/garcia-jj
Não respondo dúvidas via MP. Use o fórum. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/03/2011 13:48:07
|
jonasabreu
Debugger
![[Avatar]](/images/avatar/54d97d6613bb7ac9f94dc4619a06310b.jpg)
Membro desde: 17/09/2007 18:42:58
Mensagens: 52
Offline
|
Sim. O XStream também usa coisas assim para acelerar reflection.
|
Mirror DSL - Reflection de forma simples - http://projetos.vidageek.net/mirror-pt
VidaGeek.net - http://vidageek.net |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/03/2011 13:51:49
|
Paulo Silveira
Administrador
![[Avatar]](/images/avatar/a87ff679a2f3e71d9181a67b7542122c.jpg)
Membro desde: 07/08/2002 18:38:50
Mensagens: 4204
Localização: São Paulo
Offline
|
Ola
Muito bom, tem ate testes.
Usar sun.misc não é portavel infelizmente. Nao vai funcionar no openjdk, por exemplo. E provavelmente tambem nao na jvm da IBM.... haverá ClassDefNotFoundError.
Mas existem bibliotecas que encapsulam essas chamadas especificas, assim como o XStream e o Objenesis fazem. Ai fica "seguro".
jonasabreu wrote:@garcia-jj
Usando classes internas da VM dá pra ser consideravelmente mais rápido que a VM pois você consegue ignorar várias checagens de segurança. Além de que no caso de fields, você consegue acesso direto à memória usando o sun.misc.Unsafe.
Jonas, deve ser bem facil mudar a implementacao pra ficar mais rapido, mas acho ate um pouco desnecessario na maioria absoluta dos casos: a diferenca de gastar 1 nano segundo e 10 nanosegundos, numa operacao que só faremos 1 vez num request web, é mais que negligenciavel. Prefiro que continuem utilizando a reflection pura e mantenha compatibilidade da maneira simples.
This message was edited 1 time. Last update was at 23/03/2011 13:54:21
|
http://blog.caelum.com.br twitter: @paulo_caelum
|
|
|
 |
|
|