2013-09-02 4 views
0

누구든지 조언을 줄 수 있는지 궁금합니다. 여러 POJO에 대한 Json 디시리얼라이저/시리얼 라이저를 작성했습니다. 가능한 한 포괄적 인 것으로 만들기 위해서, 그들은 POJO getter/setter 메소드를 반대하는 리플렉션에 의존한다. 이것은 성능에 가장 큰 영향을 미치기 때문에 검색된 후에 Method 객체를 저장하는 일종의 'ClassUtils'캐시를 만들려고했습니다. Introspector를 사용하여 속성 설명자 목록을 얻은 다음 get/set을 얻습니다. 3.5 초는 구아바 캐시 1,000 객체 직렬화 - 그것은 내가 만든 사용자 지정 캐시에 비해 대단히 느렸다, 그것은 아주 좋은 유용한 기능을 가지고있는 동안 - 거기에서 방법)리플렉션을 보조하기위한 고성능 개체 캐시

그러나, 내가 먼저 구아바 LoadingCache를 사용하려고 그리고 내 자신 만 < 1 초 ... 그러나, 내 자신의 캐시

(너무 오래 된 항목 및 삭제 등) 구아바의 유용한 기능을 많이 부족 중 하나 구아바 성능 향상에 대한 조언이 있는가, 또는 맞춤 cac 개선을위한 그? 나는 실제로 코드를 게시 할 수 없다. 그러나 내 자신의 사용자 정의 캐시는 기본적으로 String을 키로 사용하여 PropertyDescriptors를 저장하는 HashMap을 감싸는 래퍼입니다 (전체 클래스 이름으로 키를 저장해야합니다. 속성 이름 (예 : "com.company.package.classes.myclass.property")

+0

[afterburner] (https://github.com/FasterXML/jackson-module-afterburner)와 선택적으로 Jackson을 사용하여 리플렉션을 바이트 코드 생성으로 바꿉니다. 불행히도 코드없이 구아바를 디버깅 할 수 없습니다. [ConcurrentLinkedHashMap] (https://code.google.com/p/concurrentlinkedhashmap/)은 Guava 포트보다 여전히 빠르지 만 많은 기능이 Guava에만 추가되었습니다. –

답변

1

JSon을 사용하지 않습니다. 바이너리 형식을 사용하는 경우 데이터 구조의 복잡성에 따라 직렬화/직렬화에 대한 성능이 10 - 100 배 높아질 수 있습니다. 퍼포먼스를 원한다면 모든 것을 완전히 범용으로 만들지 않아야합니다.

몇 줄의 코드로 LinkedHashMap을 LRU 캐시로 사용할 수 있습니다.

각 속성을 별도의 키로 저장하면 적절한 개체를 사용하는 것보다 약 1 배 정도 느립니다. 다시 말하지만 덜 일반적이지만 훨씬 더 효율적입니다.

+0

나는 Json을 사용해야한다 : (나는 객체로서 속성을 저장하는 것으로 실험 해왔다. 즉, 객체에 get/set/constructor 메소드를 저장하고, 속성 이름을 키가 더 빠른 속도로 향상시킨 것 같다. – KingTravisG

+0

또한 , 메서드를 저장하는 각 객체가 불변이므로 해시 코드를 캐싱하면 성능이 향상됩니다. – KingTravisG

+0

문제가 무엇인지 추측하는 대신 프로파일 러에서 코드를 실행할 때 성능 병목 현상으로 볼 수 있습니까? 메모리와 CPU 프로파일 링을 동시에 수행 할 수 있습니다. –