Arrays.sort의 인수 Comparator를 람다 식으로 주었을 때 발생한 성능 열화의 예 보고

2502 단어 java8자바codility
Codility Lesson6의 NumberOfDiscIntersections 를 Java로 해답하고 있을 때, 람다식 이용시에 성능이 열화되는 현상을 확인했으므로 공유한다.

참고: 아래의 위의 문제에 대한 답변 예제는 GitHub의 링크 대상에 포함되어 있습니다.

람다식 이용시



최초의 해답에서는 이하와 같이 람다식을 이용했다.
람다 식 이용시 소스 코드

그 결과가 다음과 같이 되었다.


N이 클 때 성능 점수가 기준을 충족하지 않는 것으로 확인됩니다.

익명 클래스 이용 시



성능 개선을 시도해 시행착오하고 있는 동안, 이하와 같이 람다식으로부터 익명 클래스를 이용하도록 수정했다.
익명 클래스 사용으로 수정

그 결과가 다음과 같이 되었다.


밀리 세컨드 단위이지만, 퍼포먼스가 개선하고 있는 것이 확인된다.

결과와 고찰



람다식을 이용하면, 익명 클래스를 이용했을 때와 비교해 퍼포먼스가 열화하는 경우가 있는 것을 알 수 있었다. 즉, 성능이 시비어에 요구되는 경우, 람다 식을 이용하여 리팩토링 할 때 성능의 회귀 테스트도 필요할 가능성을 시사한다.

관련 정보를 인터넷에서 찾아보면, 예를 들면 Java 각각 쓰는 방법으로 얼마나 성능이 다른가? 측정 비교해 보았다. 스트림과 루프 - Qiita에는 람다식에 의해 성능이 개선되거나 차이가 없다고 쓰여 있다. 그러나 자바: 람다는 느린가요? - 개발 메모에는 람다식에 의해 성능이 열화된다고 쓰여 있다.
람다와 invokedynamic 꿀 달에 따르면 익명 클래스의 실행 시간 증가 요인이 I/O와 jar의 압축 해제 인 반면, 람다 식의 실행 시간 증가 요인은 부트 스트랩 메소드 호출과 바이트 코드 생성이며 전자 합이 후자의 합보다 작다(링크처 슬라이드 38페이지) 때문이 아닐까 생각된다.

이번의 경우라면, 익명 클래스는 클래스의 생성이 실행전에 이루어져 계측의 대상외가 된 것에 대해, 람다의 클래스는 클래스의 생성이 실행시에 되었기 때문에, 그만큼 성능이 열화한, 라고 생각된다.

...솔직히 그다지 자신감이 없기 때문에, 만약 뭔가 지적이 있으면 교수 받을 수 있으면 다행입니다.

좋은 웹페이지 즐겨찾기