Pergunta

Nós começamos a usar Spring AOP para aspectos transversais da nossa aplicação (segurança e armazenamento em cache no momento).

Meu gerente preocupações sobre o impacto desta tecnologia, embora ele entende perfeitamente os benefícios de desempenho.

A minha pergunta, se você tiver problemas de desempenho introduzidas pelo uso de aop (especificamente Spring AOP)?

Foi útil?

Solução

Enquanto você tem controle do seu AOP Eu acho que é eficiente. Tivemos problemas de desempenho de qualquer maneira, por isso, próprio raciocínio não estávamos totalmente no controle;) Este foi principalmente porque é importante que qualquer um que escreve aspectos tem completo compreensão de todos os outros aspectos do sistema e como eles se relacionam. Se você começar a fazer coisas "inteligentes" você pode enganar a si mesmo em um instante. Fazer as coisas inteligentes em um grande projeto com muita gente que só vê pequenas partes do sistema pode ser em termos de performance muito perigoso. Este conselho provavelmente se aplica sem AOP também, mas AOP permite atirar no próprio pé em algumas maneiras elegantes reais.

Spring também usa proxy para o escopo-manipluations e isso é uma área onde é fácil obter as perdas de desempenho indesejada.

Mas dado que você tem o controle, o ponto de dor só real com AOP é o efeito sobre a depuração.

Outras dicas

Se o desempenho vai ser uma preocupação, temos utilizado AspectJ com grande efeito.

Porque ele usa bytecode tecelagem (tempo de compilação vs. tempo de execução faz bastante a diferença) é um dos quadros AOP mais rápidos lá fora. Veja: AOP Benchmarks

Quando eu usei isso, eu não fiz -. Mas então a minha candidatura não é a sua aplicação

Se você usá-lo para chamadas que são usados ??em um loop muito apertado, há o oportunidade para um sucesso significativo no desempenho. Se é apenas usado para verificar a segurança uma vez por pedido e de cache várias coisas, eu não posso ver como é provável que seja significativa -. Mas é por isso que você deve perfil e referência o aplicativo

Eu percebo que "medida com o seu app" provavelmente não é a resposta que você estava procurando, mas pode muito bem ser o que você adivinhou que você deseja obter:)

Se você estiver usando AOP baseado em proxy, você está falando de uma invocação adicional método Java per aspecto aplicada. O impacto no desempenho não é muito insignificante. A única preocupação real é a criação dos proxies, mas isso geralmente acontece apenas uma vez na inicialização do aplicativo. O blog SpringSource tem um ótimo post sobre isso:

http://blog.springsource.com / 2007/07/19 / debunking-mitos-proxies impacto no desempenho /

Em teoria, se você usar AOP fazer para que você poderia fazer com acoplamento rígido, não há nenhum problema de desempenho, nenhuma sobrecarga e há chamadas de método extras a menos que tecem para nada. AOP Framework oferece uma maneira para remover o acoplamento duro e fatorar sua preocupação transversal.

Na prática, AOP Framework pode apresentar 3 tipos de sobrecarga:

  • fogo em tempo
  • interceptação mecânico
  • Integração do consumidor (maneira de desenvolver um conselho)

Para mais informações você pode se referir a quando-é-aop-code- executado .

Apenas tenha cuidado como você implementar um conselho porque o código transversal é uma tentação para o boxe / unboxing e reflexão (caro em termos de desempenho).

Sem um quadro AOP (acoplamento rígido suas preocupações transversais) você pode desenvolver seus conselhos presumidos (dedicado para cada tratamento) mais fácil sem boxing / unboxing e reflexão.

Você tem que saber que a maioria AOP Framework não oferecem a maneira de evitar totalmente boxing / unboxing e reflexão.

Eu desenvolvi um para responder à maior parte das necessidades falta concentrado para 3 coisas:

  • user friendly (leve, fácil de aprender)
  • transparente (sem código de quebra de incluir)
  • eficiente (sem boxing / unboxing, nenhuma reflexão no código do usuário nominal e bom mecânico interceptação)

Você pode encontrar o meu projeto de código aberto aqui: Puresharp API .net 4.5.2+ anteriormente < a href = "https://github.com/Virtuoze/NConcern" rel = "nofollow noreferrer"> NConcern .NET Framework AOP

Você já pensou em uma ferramentas AOP que a adição de aspectos de objeto em tempo de execução quando você precisa? Há um para .net "Adicionar Aspectos a objeto usando dinâmico Decorator" (http://www.codeproject.com/KB/architecture/aspectddecorator.aspx). Eu acredito que você pode escrever um similar para Java.

Se você estiver usando alguma estrutura um para aspectos pode haver alguns problemas de desempenho .next se você estiver criando abstração acima de algum quadro um e aspectos manuseio é feito a partir de enquadramento, em seguida, é muito difícil descobrir a causa do problema relativo ao Problemas de desempenho . Se você está realmente preocupação com o desempenho ea preocupação pequena fatia de tempo mais, eu sugiro que escrever próprios aspectos .Não um quer reinventar a roda, mas em algum momento para melhor pode ser best.You pode escrever própria implementação da AOP aliança abstração.

i ter AOP Primavera usada em um processo em lote no meu projeto atual para transações de gerenciar um banco de dados.

Na primeira, ele foi descobri que não seria um problema de desempenho, mas não o fizemos figura na equação que chamamos os milhares de bancos de dados de vezes. uma chamada aspecto em aop não afeta o desempenho muito, mas multiplique isso por milhares, e não é que o novo sistema foi pior do que o antigo, devido a essas chamadas de método extra.

Eu diria que aop é um grande sistema para uso, mas tente tomar nota de quantos métodos chamadas são adicionados à sua aplicação

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top