programing

op 사용 시 성능에 미치는 영향

codeshow 2023. 9. 24. 13:12
반응형

op 사용 시 성능에 미치는 영향

애플리케이션(현재 보안 및 캐싱)의 여러 측면을 교차하기 위해 스프링 에이오피를 사용하기 시작했습니다.

매니저는 이점을 충분히 이해하고 있지만 이 기술의 성능에 미치는 영향에 대해 걱정하고 있습니다.

궁금한 점이 있는데, aop(특히 spring aop) 사용으로 인해 발생한 성능 문제가 있습니까?

당신이 당신의 AOP를 통제할 수만 있다면 저는 그것이 효율적이라고 생각합니다.어쨌든 성능에 문제가 있었기 때문에 나름의 추론으로 충분히 통제할 수 없었습니다.) 이는 대부분의 측면을 작성하는 사람이 시스템의 다른 모든 측면과 그 측면이 어떻게 상호 연관되는지에 대해 충분히 이해하는 것이 중요하기 때문입니다."똑똑한" 일을 시작하면 순식간에 자신을 능가할 수 있습니다.시스템의 작은 부분만 보는 많은 사람들이 참여하는 대규모 프로젝트에서 똑똑한 일을 하는 것은 성과 측면에서 매우 위험할 수 있습니다.이 조언은 아마도 AOP 없이도 적용될 수 있지만, AOP를 사용하면 정말 우아한 방식으로 자신의 발에 총을 쏠 수 있습니다.

스프링은 또한 스코프 조작에 프록시를 사용하므로 원하지 않는 성능 손실이 발생하기 쉬운 영역입니다.

하지만 통제력이 있기 때문에 AOP의 유일한 실질적인 문제점은 디버깅 효과뿐입니다.

성능이 문제가 될 경우 AspectJ를 사용하여 큰 효과를 얻었습니다.

바이트코드 직조(컴파일 시간 대 런타임이 상당한 차이를 만들어냄)를 사용하기 때문에 가장 빠른 AOP 프레임워크 중 하나입니다.참조: AOP 벤치마크

제가 사용했을 때는 사용하지 않았습니다. 하지만 제 애플리케이션은 사용자의 애플리케이션이 아닙니다.

매우 촘촘한 루프에서 사용되는 통화에 사용하면 상당한 성능 히트의 기회가 생깁니다.요청할 때마다 한 번씩 보안을 확인하고 다양한 것을 캐싱하는 데만 사용된다면 얼마나 중요한지 알 수 없지만, 을 프로파일링하고 벤치마크해야 하는 이유입니다.

"앱으로 측정"이 여러분이 찾던 답이 아닐 수도 있다는 것을 깨달았지만, 아마 여러분이 예상했던 답일 수도 있습니다:)

프록시 기반 AOP를 사용하는 경우 적용되는 측면당 1개의 추가 Java 메서드 호출을 말하는 것입니다.성능에 미치는 영향은 상당히 미미합니다.유일한 실질적인 관심사는 프록시를 만드는 것이지만, 이는 보통 애플리케이션을 시작할 때 한 번만 발생합니다.SpringSource 블로그에는 다음과 같은 훌륭한 게시물이 있습니다.

http://blog.springsource.com/2007/07/19/debunking-myths-proxies-impact-performance/

이론적으로 AOP를 사용하면 하드 커플링으로 할 수 있는 작업을 수행할 수 있습니다. 아무 이유 없이 짜지 않는 한 성능 문제도 없고 오버헤드도 없으며 추가 메소드 호출도 없습니다.AOP Framework는 하드 커플링을 제거하고 교차 절단 우려를 인수분해할 수 있는 방법을 제공합니다.

실제로 AOP Framework는 세 가지 유형의 오버헤드를 도입할 수 있습니다.

  • 화재시의
  • 요격 기술자
  • 소비자 통합 (조언 개발 방법)

자세한 내용은 when-is-aop-code-executive를 참조할 수 있습니다.

가로쓰기 코드는 복싱/복싱과 성찰의 유혹(성능면에서 비싼)이기 때문에 조언을 어떻게 구현하는지 주의해야 합니다.

AOP Framework(교차로에 대한 우려를 강하게 결합하는)가 없어도 복싱/복싱 및 성찰 없이 예상되는 조언(각 시술에 대한 전용)을 보다 쉽게 개발할 수 있습니다.

대부분의 AOP Framework는 완전한 복싱/복싱 해제 및 반사를 피할 수 있는 방법을 제공하지 않는다는 것을 알아야 합니다.

저는 대부분의 누락된 요구에 대응하기 위해 다음과 같은 세 가지 사항을 개발했습니다.

  • 사용자 친화적(경량, 배우기 쉬운)
  • 투명(포함할 브레이킹 코드 없음)
  • 효율적(복싱/복싱 없음, 공칭 사용자 코드에 반영되지 않음, 양호한 감청 정비사)

여기서 제 오픈소스 프로젝트를 보실 수 있습니다: Puresharp API.net 4.5.2+ 이전 Nconcern.NET AOP 프레임워크

필요할 때 런타임에 객체에 측면을 추가하는 AOP 도구에 대해 생각해 본 적이 있습니까?.net "Add Aspects to Object Using Dynamic Decorator"(http://www.codeproject.com/KB/architecture/aspectddecorator.aspx) 에 대한 것이 있습니다.자바용으로 비슷한 것을 쓰실 수 있으리라 믿습니다.

한 가지 프레임워크를 측면에 사용하는 경우 성능 문제가 발생할 수 있습니다.다음으로 어떤 프레임워크 위에서 추상화를 생성하고 프레임워크에서 여러 측면을 처리하는 경우 성능 문제와 관련된 문제의 원인을 찾는 것은 매우 어렵습니다.만약 당신이 정말로 성능과 작은 시간 조각에 대한 관심이 더 많다면, 나는 자신의 측면을 쓰는 것을 제안합니다.아무도 바퀴를 재창조하고 싶어하지 않지만 언젠가는 더 나은 방법이 될 수 있습니다.AOP 동맹 추상화의 구현을 직접 작성할 수 있습니다.

저는 데이터베이스를 트랜잭션 관리하기 위해 현재 프로젝트에서 batch process로 spring AOP를 사용했습니다.

처음에는 성능에 문제가 없을 것으로 판단했지만, 데이터베이스를 수천 번 호출한 방정식은 파악하지 못했습니다.aop의 한 측면 호출은 성능에 큰 영향을 미치지 않지만, 수천 배를 곱하면 새로운 시스템이 이전의 것보다 더 나빴던 것으로 드러났습니다. 이러한 추가적인 메소드 호출 때문입니다.

저는 aop가 사용하기에 좋은 시스템이라고 말하고 싶지만, 당신의 애플리케이션에 얼마나 많은 메소드 호출이 추가되는지 주목해보세요.

질문이 있은 지 11년이 지난 지금, 이 상황이 얼마나 퇴보하고 있는지 보세요.

예: 대다수의 사람들은 간단한 @Transactional spring java 주석을 어떤 방법에 적용하고 호출자와 호출자 프록시 구성요소 사이에서 spring이 가교 역할을 하도록 하는 것이 괜찮다고 생각합니다.이제 그들은 20개 이상의 디버깅 불가능한 '마법' 코드의 스택 프레임을 가지고 있습니다.JIT 컴파일러는 빠르게 초과되어 더 이상 인라인을 시도할 수 없거나 수많은 클래스가 생성되어 메모리가 부풀어 오릅니다.

이 '프레임워크 사용자' 시대에는 게으름에 한계가 없습니다.사소한 http 통화에 대한 e2e 시간이 100ms에서 10초로 늘어난 것도 당연합니다.128MB로 실행되던 형편없는 서블릿 컨테이너를 실행하려면 2GB가 필요한 것도 당연합니다. 그리고 예외 스택 트레이스를 기록하는 비용에 대해서는 시작하지 마세요.

언급URL : https://stackoverflow.com/questions/433475/performance-impact-of-using-aop

반응형