자바 기반 List 내 요소 의 정렬 성능 비교
일상적인 개발 에서 일부 데 이 터 를 얻 은 후에 일정한 규칙 에 따라 이 데 이 터 를 정렬 해 야 할 수도 있다.JAVA 에 서 는 동적 배열 ArrayList 가 데 이 터 를 저장 하 는 데 자주 사용 되 기 때문에 ArrayList 의 요 소 를 어떻게 효율적으로 정렬 하고 조건 에 맞 는 데이터 세트 를 형성 하 는 지 는 일상적인 개발 에서 반드시 고려 해 야 할 문제 이다.본 고 는 집합 프레임 워 크 가 제공 하 는 Collections.sort 방법,Comparable 인터페이스 실현,그리고 JAVA 8 stream 흐름 에서 제공 하 는 정렬 방법 을 분석 하 는 동시에 같은 조건 에 따라 데이터 세트 크기 의 정렬 성능 을 비교 할 것 이다.
2.조건 에 따라 몇 가지 방안 과 성능 대 비 를 정렬 한다.
2.1 집합 프레임 워 크 가 제공 하 는 Collections.sort 를 이용 하여 정렬
private ArrayList<StreamConfig> testCollectionSort(ArrayList<StreamConfig> lists) {
Collections.sort(lists, new Comparator<StreamConfig>() {
@Override
public int compare(StreamConfig s1, StreamConfig s2) {
return s2.getLostThreshold() - s1.getLostThreshold();
}
});
return lists;
}
@Data
@ToString
public class StreamConfig {
/**
*
*/
private Long id;
/**
* ( )
*/
private Integer detectRate;
/**
*
*/
private Integer lostThreshold;
/**
* ( : )
*/
private Integer reportRate;
/**
*
*/
private Date createTime;
/**
*
*/
private Date modifyTime;
}
long startTime = System.currentTimeMillis();
log.info("Collection.sort :{}", System.currentTimeMillis());
ArrayList<StreamConfig> list = testCollectionSort(lists);
long endTime = System.currentTimeMillis();
log.info("Collection.sort :{} ms", endTime - startTime);
2.2 Comparable 인터페이스 실현
@Data
@ToString
public class StreamConfig implements Comparable<StreamConfig>{
/**
*
*/
private Long id;
/**
* ( )
*/
private Integer detectRate;
/**
* ( )
*/
private Integer lostThreshold;
/**
* ( : )
*/
private Integer reportRate;
/**
*
*/
private Date createTime;
/**
*
*/
private Date modifyTime;
/**
*
*/
private String remark;
/**
* nodeCode
*/
private String nodeCode;
/**
* Id
*/
private String unitId;
@Override
public int compareTo(StreamConfig o) {
return this.getLostThreshold() - o.getLostThreshold();
}
}
long comparableStartTime = System.currentTimeMillis();
Collections.sort(list3);
long comparableEndTime = System.currentTimeMillis();
log.info("Comparable :{}", comparableEndTime - comparableStartTime);
2.3 JAVA 8 stream 흐름 을 이용 하여 정렬
long streamStartTime = System.currentTimeMillis();
log.info("java 8 stream :{}", streamStartTime);
List<StreamConfig> collect = list2.stream().sorted(Comparator.comparing(StreamConfig::getLostThreshold)).collect(Collectors.toList());
log.info("java 8 stream :{} ms", System.currentTimeMillis() - streamStartTime);
2.4 성능 대비테스트 방안:
Collection.sort 와 Comparable 인 터 페 이 스 를 실현 하 는 두 가지 방법의 상호 방 해 를 방지 하기 위해 Comparable 방안 의 단독 테스트 를 실현 할 것 이다.데이터 양 집 은 각각 1000,10000,100000 이 고 결과 단 위 는 밀리초(ms)이 며 각 데이터 세트 는 다섯 번 테스트 하여 평균 값 을 취한 다.
테스트 코드 는 다음 과 같 습 니 다:
public String test() {
ArrayList<StreamConfig> lists = new ArrayList<>(100000);
for (int i = 0; i < 100000; i++) {
StreamConfig streamConfig = new StreamConfig();
streamConfig.setReportRate((int) (Math.random() * 10000));
streamConfig.setLostThreshold((int) (Math.random() * 100000));
streamConfig.setDetectRate((int) (Math.random() * 10000));
streamConfig.setCreateTime(randomDate("2019-01-01", "2021-05-31"));
streamConfig.setId(System.currentTimeMillis() + (int) (Math.random() * 100000));
lists.add(streamConfig);
}
ArrayList<StreamConfig> list2 = new ArrayList<>(lists);
ArrayList<StreamConfig> list3 = new ArrayList<>(lists);
long startTime = System.currentTimeMillis();
log.info("Collection.sort :{}", System.currentTimeMillis());
ArrayList<StreamConfig> list = testCollectionSort(lists);
long endTime = System.currentTimeMillis();
log.info("Collection.sort :{} ms", endTime - startTime);
log.info("Comparable :{}", System.currentTimeMillis());
long comparableStartTime = System.currentTimeMillis();
Collections.sort(list3);
long comparableEndTime = System.currentTimeMillis();
log.info("Comparable :{}", comparableEndTime - comparableStartTime);
long streamStartTime = System.currentTimeMillis();
log.info("java 8 stream :{}", streamStartTime);
List<StreamConfig> collect = list2.stream().sorted(Comparator.comparing(StreamConfig::getLostThreshold).reversed()).collect(Collectors.toList());
log.info("java 8 stream :{}", System.currentTimeMillis());
log.info("java 8 stream :{} ms", System.currentTimeMillis() - streamStartTime);
return "success";
}
테스트 결 과 는 다음 과 같다.소결
1.테스트 결 과 를 보면 데 이 터 량 이 각각 1000,10000,100000 의 데이터 세트 에서 자바 8 stream 의 정렬 방안 은 Collection.sort 방안 과 Comparable 인터페이스 방안 을 실현 하 는 데 걸 리 는 시간 보다 훨씬 많다.
2.테스트 결 과 를 보면 Collection.sort 방안 과 Comparable 인터페이스 방안 을 실현 하 는 데 걸 리 는 시간 이 가 까 울 수록 이 두 가지 방안 은 데이터 양 이 같 을 때 차이 가 크 지 않다.
3.본 고 에서 비교 한 것 은 단일 조건 에서(즉,lost Threshold 속성 값 에 따라 비교 하 는 것)다 중 조건 이 약간 차이 가 있 을 수 있 고 후속 적 으로 다 중 조건 에 대해 데이터 테스트 와 검증 을 할 수 있다.
4.테스트 결 과 를 통 해 알 수 있 듯 이 단일 조건 을 비교 할 때 Collection.sort 방안 과 Comparable 인터페이스 방안 이 더욱 높 은 성능 을 가지 고 데이터 양 이 많 을 때 이 두 가지 정렬 방식 을 사용 하 는 것 을 권장 합 니 다.
자바 기반 의 List 요소 의 정렬 성능 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.자바 List 요소 의 정렬 성능 에 관 한 더 많은 내용 은 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부 탁 드 리 겠 습 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.