이미 알고 있는 것도 있고 아닌 것도 있는데 처음부터 정리하는것에 대한 부담감이 확 들었다. 그래서 내가 모르는 게 있었다면 그것에 대하여 기술하려고 한다!
예전에 본 것이다. stream과 for의 성능차이에 대한 영상인데 boxing작업 때문에 발생하는 오버헤드가 있고 어떤 상황에서 stream과 for을 나누어 작업하는 것이 좋은지에 대하여 설명해주었다.
사진은 내가 정리한 글이다.
좋은 습관 좋지 못한 습관
// 좋지 못한 습관
for(int i = 0; i < list.size(); i++){ ... // size()메서드가 매번 반복하면서 호출됨
// 조금 더 좋은 습관
int size = list.size();
for(int i = 0; i < size; i++){ ... // size() 메서드가 한번만 호출됨
//향상된 for문
List<String> list = new ArrayList<>();
for(String str : list){... // 객체를 바로 사용할 수 있고 인덱스가 넘어가는 등에 예외코드를 없앨 수 있음
Java
복사
그럼 과연 저 3가지의 성능은?
1번은 2ms
2번은 1ms
3번은 16ms
나왔다.
public static void main(String[] args) {
List<Integer> list = IntStream.rangeClosed(0, 100_000).boxed().collect(Collectors.toList());
StopWatch stopWatch = new StopWatch();
stopWatch.start();
int result = 0;
for (int i = 0; i < list.size(); i++) {
result += i;
}
System.out.println(result);
stopWatch.stop();
System.out.println("startTime : " + stopWatch.getStartTime());
System.out.println("elapsedTime(ms) : " + stopWatch.getTime());
System.out.println("elapsedTime(ns) : " + stopWatch.getNanoTime());
--
705082704
startTime : 1658039330327
elapsedTime(ms) : 2
elapsedTime(ns) : 2868600
stopWatch = new StopWatch();
stopWatch.start();
result = 0;
int size = list.size();
for (int i = 0; i < size; i++) {
result += i;
}
System.out.println(result);
stopWatch.stop();
System.out.println("startTime : " + stopWatch.getStartTime());
System.out.println("elapsedTime(ms) : " + stopWatch.getTime());
System.out.println("elapsedTime(ns) : " + stopWatch.getNanoTime());
--
705082704
startTime : 1658039330349
elapsedTime(ms) : 1
elapsedTime(ns) : 1294400
stopWatch = new StopWatch();
stopWatch.start();
result = 0;
for (int i : list) {
result += i;
}
System.out.println(result);
stopWatch.stop();
System.out.println("startTime : " + stopWatch.getStartTime());
System.out.println("elapsedTime(ms) : " + stopWatch.getTime());
System.out.println("elapsedTime(ns) : " + stopWatch.getNanoTime());
--
705082704
startTime : 1658039330351
elapsedTime(ms) : 16
elapsedTime(ns) : 16952000
}
Java
복사
Apatch StopWatch 사용
선택의 함정
if-else와 switch가 얼핏 똑같은데 무슨 차이가 있을까? 라는 의문이 들었다(속도가 아닐까?). 하여튼 그래서 찾아본 결과 if-else의 경우 여러 선택 사항을 구현하면 실행속도가 느려진다. 하지만 switch의 경우 선택지가 여러가지인 경우 실행속도가 if-else 보다 훨씬 빠르다라고 설명하고 있었다. 그래서 성능을 비교하려고 했는데 좋은 글을 찾았다. 직접 10개에서 100개로 조건식을 늘려 비교했는데 약, 2배 이상으로 switch-case문의 성능이 더 좋은 것으로 나타났다. 꼭 보자