백준 10950

YJ·2022년 3월 23일
0
post-thumbnail

- 문제




- 풀이1

for문 밖에 변수를 선언했다.



for문 안에 변수를 선언했다.



위와 같이 반복문 밖에 변수를 선언했을 경우와 반복문 안에 변수를 선언했을 경우를 비교했을 때, 성능이 더 좋은 경우가 궁금했다.

https://okky.kr/article/1185275


솔직히 for문 안에 변수 선언 및 할당을 하는 것이 좋은지,
for문 밖에 변수 선언을 하고 for문 안에서는 변수 할당만
하는 것이 좋은지 정확히 알 수 없었다.

따라서 직접 간단한 테스트를 만들어 비교해보기로 했다.



- 테스트

http://codechacha.com/ko/java-performance-counter/
Java 코드 실행 시간 측정을 위해 어떤 코드를 써야 하는지에 대한 정보를 얻은 사이트이다. 이 중 System.currentTimeMillis()를 사용했다.



  1. 1억번 반복

변수를 for문 밖에 선언



변수를 for문 안에 선언



보다시피 해당 class의 main 메소드에 int 변수와 객체 변수를 선언하고, 이를 할당하는 코드를 작성해서 테스트 했다.


1억번 반복을 시켰을 경우 for문 안에 변수를 선언하고 값을 할당한 경우가 172ms가 빨랐다.



  1. 10억번 반복

변수를 for문 밖에 선언



변수를 for문 안에 선언


for문 밖에 변수를 선언한 경우에 약 4초, 3697ms 빠르다.



  1. 21억번 반복

변수를 for문 밖에 선언



변수를 for문 안에 선언


for문 밖에 변수를 선언한 경우에 약 9초,8685ms 빠르다.



[정리]

1. 솔직히 내부적으로 어떤 차이가 있는지 잘 모르겠다. 

2. 혹자는 for문 안에서 변수 선언 및 할당을 하면
비효율 적인 작업이 발생한다고 말한다. (heap 영역에
객체가 많이 생성된다던지..)

3. 대부분 사람들은 컴파일러가 최적화 해주기 때문에 
내부적으로 비슷하고, 성능 차이가 거의 없다고 한다.

4. 따라서 가독성 좋게 for문 안에 변수 선언 및 
할당을 하도록 권하는 사람이 많았다.

5. for문 안에서 변수 선언 및 할당을 했을 경우 지역 변수로
사용되어 동작이 끝난 뒤 변수는 존재하지 않는다. 따라서 변수
사용 범위를 고려해 상황에 맞게 선택해야 한다.


더 복잡한 코드, 로직, 더 많은 반복 횟수로 테스트 했으면 
유의미한 결과를 만들 수 있었을지 모르겠지만 아직 실력이..^^



관련 내용을 다루고 있는 링크
https://hyeonk-lab.tistory.com/44




- 풀이2

StringBuilder를 사용해봤다.





마지막으로 int 배열을 사용한 풀이와 StringBuilder를 사용한 풀이 중 무엇이 더 빠를지 궁금해졌다. int 배열이 빠를까, StringBuilder가 빠를까?



StringBuilder에 랜덤 숫자 백만개를 넣고 출력



int를 사용하기 위해서는 형변환 및 추가 작업이 필요해 double로 테스트 하게됐다. (int와 double 배열이 같은 속도일 것으로 추정).


결과는 1초 차이로 StringBuilder가 더 빨랐다.



StringBuilder 100만개


double 배열 100만개


6초 차이로 StringBuilder가 더 빠르다.



결론 : StringBuilder가 배열에 넣어서 출력하는 것 보다 더 빠르다.

profile
hi

0개의 댓글