Pessoal,
vou responder tudo em partes. Vamos lá:
1) Acho que o cenário deste teste que foi apresentado não representa
uma amostra fiel do que uma aplicação faz, afinal não executamos 1000x
a mesma consulta. Se esse fosse o caso, NHibernate ganharia de alguns
milhões a zero, pois com ADO você iria 1000x no DB enquanto com NH
usando cache nivel 1 (que é padrão) você iria uma vez só.
2) Em outros cenários onde as consultas são mais hetereogênas, ADO
nativo deve ganhar por pouco, mas só se você escrever suas rotinas de
hidratação de maneira 100% perfeita, pois o NH utiliza reflection pra
efetuar a hidratação das entidades e isso vai dar um impacto em
performance com certeza.
3) Em uma aplicação OLTP geralmente NH deve ganhar justamente pelo uso
do cache nivel um e dar um show caso você habilite cache nivel dois.
Ele ganha porque vai manter diversos objetos pré carregados enquanto
com ADO nativo você teria que efetuar o controle de maneira manual
além de possuir diversas estratégias de fetch prontas e otimizadas.
4) Em todo caso, você não precisa usar sempre LINQ ou consultas usando
traversing. Um ORM é muito mais. Além do LINQ, vc tem HQL que consegue
gerar qualquer query e te devolver objetos anonimos/DTOs e também as
projections pra operar sobre grupos e aggregates que também te devolve
objetos anonimos/DTOs. Pra finalizar, pra consultas dinamicas e
tipadas vc ainda tem Criteria que é ninja.
5) Por ultimo, em uma aplicação onde leituras são intensas você tem
dois cenários: a) Uso de cache no front end (IIS no caso de uma
aplicação web) então tanto faz o jeito que vc efetua a consulta, pois
o HTML final vai ficar armazenado e b) Construir uma aplicação voltada
pra relatórios com a tecnologia adequada e ai não seria o caso de um
ORM, mas sim outras ferramentas também diferentes do ADO nativo.
Em qualquer cenário, por mais que exista algum impacto de performance
(e ele existe) este impacto não vai ser seu gargalo e se for, seria o
mesmo que se você usasse ADO nativo, portanto não faz sentido escrever
DAO na mão. O benefício de usar um ORM (decente) supera todos os
drawbacks.
Vou tentar fazer um benchmark e um post com algumas considerações a
respeito.
Att.,
Tuca
On Aug 31, 11:57 am, Vinicius Quaiato <
vinicius.quai...@gmail.com>
wrote:
> Acho que a menos que você vá trabalhar com DataTable, utilize o ORM (e mesmo
> assim não sei se o TableAdapter.Fill é mais rápido).
>
> *Vinicius Quaiato*
http://viniciusquaiato.com
>
> <vquaiato> Twitter <vquaiato>
> [image: Google Talk/]
vinicius.quai...@gmail.com [image: MSN/]
>
vinicius.quai...@gmail.com
>
> 2010/8/31 Diullei Gomes <
diul...@gmail.com>
>
>
>
> > Acho que a otimização prematura nesse caso deve ser evitada. Meu conselho
> > é: Utilize ORM depois utilize uma ferramenta de profile (caso esteja
> > utilizando o NHibernate poderia ser o NHprofhttp://
nhprof.com/), execute
> > testes em diversos cenários nos quais a sua consulta em questão esteja sendo
> > utilizada. Se estiver utilizando Nhibernate juntamente com o NHprof ele irá
> > te dar dicas de como otimizar sua consulta caso encontre "warns". Isso é
> > muito util... Se ainda assim depois disso tudo o tempo de resposta de sua
> > consulta não estiver satisfazendo as necessidades de tempo de resposta pré
> > estabelecidas, aí sim vc otimiza este ponto de outra forma, e nesse caso
> > escrever
ADO.NET na mão pode ou não ser uma solução.
>
> > Acho o ponto de partida para otimizar consultas deve surgir de uma
> > especificação de tempo de resposta para a mesma. Não tem importância eu
> > elevar ao extremo a velocidade de uma consulta que não dependa de um alto
> > tempo de resposta, e se a infraestrutura do meu projeto está toda utilizando
> > ORM eu só vou utilizar meu tempo escrevendo
ADO.NET ou utilizando soluções
> > de cache ou seja lá o que for... se isso for necessário para atender a minha
> > especificação.
>
> > 2010/8/31 Humberto Marchezi <
hcmarch...@gmail.com>
>
> > Acho que entendi a sua questão.
> >> Pessoalmente, eu sempre trabalho com ORMs, mas nos casos onde eu tinha que
> >> fazer uma consulta complexa ao banco-de-dados, eu trabalhava com SQLs que
> >> diretamente populavam os DTOs. Essas consultas SQL também eram encapsuladas
> >> em um método de algum repositório.
>
> >> Haviam certos tipos de consultas ao banco onde ficava mais rápido ou até
> >> mesmo mais simples de de fazer uma consulta com SQL do que com
> >> NHibenate-Linq.
> >> Mesmo que o ORM seja otimizado para gerar consultas ele não consegue saber
> >> exatamente o que vc esta querendo em alguns casos daí o uso do SQL, caso
> >> realmente necessário.
> >> Mas nós sempre tentávamos dar preferência ao Linq pois as consultas são
> >> refatoráveis.
>
> >> Olha teve uma thread sobre essa questão na lista de DDD do yahoo
> >> infelizmente não me lembro do link dessa thread.
>
> >> 2010/8/31 Alessandro de Souza <
alessandro.de.so...@gmail.com>
>
> >>> Perfeito Humberto.
> >>> A questão é que eu tendo um DTO definido, fica mais fácil (documentado)
> >>> exatamente o que será retornado pelo meu objeto de consulta (quais campos).
> >>> Mais sei também que se eu fizer um 'select new objeto...' ele popula uma
> >>> lista com os DTO´s.
>
> >>> []´s
>
> >>> Em 31 de agosto de 2010 10:31, Humberto Marchezi <
hcmarch...@gmail.com>escreveu:
>
> >>>> Mesmo que se queira retornar dados ao invés de uma lista de entidades,
> >>>> um bom ORM como o NHibernate pode fazer isso para você.
>
> >>>> *Ex:*
>
> >>>> ( from c in Repositorio<Cliente>().Query() // Retorna um
> >>>> IQueryable<Cliente>
> >>>> where c.DataNascimento = XXXXXX && c.Nome like XXXXXX
> >>>> select c.Nome, c.Endereco, c.Estado.Descricao, .... ) // Essa
> >>>> consulta retorna apenas os dados necessários
>
> >>>> Obs: Nos bastidores, o NHibernate-Linq vai gerar o SQL correspondente a
> >>>> consulta acima.
>
> >>>> 2010/8/31 Alessandro de Souza <
alessandro.de.so...@gmail.com>
>
> >>>>> Cassiano, acho que o TUCA entendeu bem. Na verdade preciso de um DTO,
> >>>>> para levar os dados dos objetos de consulta até a interface gráfica. De fato
> >>>>> devo popular uma lista com estes DTO´s.
>
> >>>>> E pelo que entedi, não há ganho de performance em deixar de usar um
> >>>>> ORM.
>
> >>>>> Eu só queria ouvir alguém que já teve experiência com este tipo de
> >>>>> situação. Apesar de que todo sistema precisa de consulta né... problema é
> >>>>> que quem usa DDD as vezes retorna dos repositórios uma lista das entidades,
> >>>>> ai sim é um erro pq consome-se muitos recursos que não serão utilizados,
> >>>>> visto que, seria apenas para mostrar os dados.
>
> >>>>> Ah.. TUCA entendi perfeitamente.. grato pela sugestão...
>
> >>>>> []´s
>
> >>>>> Em 31 de agosto de 2010 10:17, Cassiano Kuss <
cassianok...@gmail.com>escreveu:
>
> >>>>> Talvez a colocação do Alessandro seja executar as querys e simplesmente
> >>>>>> mostrar os dados retornados sem gerar objetos.
>
> >>>>>>>
dotnetarchitec...@googlegroups.com<dotnetarchitects%2Bunsubscrib
e...@googlegroups.com>
> >>>>>>
dotnetarchitec...@googlegroups.com<dotnetarchitects%2Bunsubscrib
e...@googlegroups.com>
> >>>>>
dotnetarchitec...@googlegroups.com<dotnetarchitects%2Bunsubscrib
e...@googlegroups.com>
> >>>>> Para mais opções visite o grupo em
> >>>>>
http://groups.google.com/group/dotnetarchitects?hl=pt-br
>
> >>>> --
> >>>> Humberto C Marchezi
> >>>> ---------------------------------------------------------
>
> >>>> --
> >>>> Você recebeu esta mensagem porque faz parte do grupo .Net Architects
> >>>> hospedado no Google Groups.
> >>>> Para postar envie uma mensagem para
dotnetar...@googlegroups.com
> >>>> Para sair do grupo envie uma mensagem para
> >>>>
dotnetarchitec...@googlegroups.com<dotnetarchitects%2Bunsubscrib
e...@googlegroups.com>
> >>>
dotnetarchitec...@googlegroups.com<dotnetarchitects%2Bunsubscrib
e...@googlegroups.com>
> >>> Para mais opções visite o grupo em
> >>>
http://groups.google.com/group/dotnetarchitects?hl=pt-br
>
> >> --
> >> Humberto C Marchezi
> >> ---------------------------------------------------------
>
> >> --
> >> Você recebeu esta mensagem porque faz parte do grupo .Net Architects
> >> hospedado no Google Groups.
> >> Para postar envie uma mensagem para
dotnetar...@googlegroups.com
> >> Para sair do grupo envie uma mensagem para
> >>
dotnetarchitec...@googlegroups.com<dotnetarchitects%2Bunsubscrib
e...@googlegroups.com>
> >
dotnetarchitec...@googlegroups.com<dotnetarchitects%2Bunsubscrib
e...@googlegroups.com>