백준 10950

5640 단어 baekjoonbaekjoon

- 문제



- 풀이1

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

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

이 코드를 구현하며 두가지 방법에서 어떤 것이
성능이 더 좋은지 궁금했다.

https://okky.kr/article/1185275
(내가 작성한 질문)


솔직히 for문 안에 변수 선언 및 할당을 하는 것이 좋은지,
for문 밖에 변수 선언을 하고 for문 안에서는 변수 할당만
하는 것이 좋은지 정확히 알 수 없었다.
구글링을 해보고 질문글도 남겨봤지만 명확한 답을 얻을 
수 없었다. 즉, 정확하게 신뢰성 100퍼인 정보를 얻기에
정보가 제각각이였고, 그 정보에 관한 진위여부를 구별하기에는
내 실력이 부족했다.

따라서 여태까지 미뤄뒀던 성능? 속도? 테스트 하는 방법을
알아내 간단한 테스트들을 진행해보기로 했다.

- 테스트

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문 밖에 변수를 선언한 경우에 8초,
8685ms 빠르다.


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

2. 혹자는 for문 안에서 변수 선언 및 할당을 하면
비효율 적인 일이 일어난다고 한다. (heap 영역에
객체가 많이 생성된다던지.. 이 부분은 공감이 안간다.
for문 안에 선언하던 밖에 선언하던 객체를
생성하는건 new 코드인데, 그럼 heap 영역에
객체가 생성되는건 동일한게 아닌가 싶다.)

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

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

5. for문 안에 선언 및 할당을 했을 경우 지역 변수로
사용되어 동작이 끝난 뒤 변수는 존재하지 않는다. 
따라서 이를 고려해 안에서만 사용할 변수인지, 이후에도
사용될 변수인지를 고려하는 것이 필요할 듯 하다.

6. 21억번 이상 테스트 하는 방법을 몰라서 진행하지 
못했고, 이게 올바른 테스트 방법인지는 모른다. 하지만
현 테스트에서는 10초 내의 차이를 보이고 있다. 

7. 21억번 반복 중 8초 정도의 차이가 소중하다면 
for문 밖에 선언이 필요할 것 같고, 그 정도 성능을
포기하더라도 가독성을 원한다면 for문 안에 선언하는게
맞는 것 같다. 그 이전에 앞서 말한 변수 재사용 여부에 
따라 어디에 선언할지 선택하는게 우선 시 돼야할 것 같다.

더 복잡한 코드, 로직으로 테스트 했으면 더 정확하거나
유의미한 결과를 만들 수 있었을지 모르겠지만 실력이..^^

https://hyeonk-lab.tistory.com/44
오래된 것 같지만 관련 내용을 다루고 있는 것 같아서
첨부



- 풀이2


StringBuilder를 알게되어 사용해보게 됐다.
쓴 김에 살짝 구글 검색으로 StringBuilder를 알아봤다.




작성을 마치려고 하는데, int 배열에 넣어서 출력했던
풀이와 StringBuilder에 넣어서 출력했던 풀이 간에
무엇이 더 빠를지 궁금해졌다. int 배열이 빠를까,
StringBuilder가 빠를까? 구글링이 안되서 직접
테스트 해봤다.


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


int로 실험하기 위해서는 형변환 및 기타 작업이
들어가야 해서 double로 테스트 하게됐다.
(int와 double 배열이 같은 속도일 것으로 추정)

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



StringBuilder 100만개


double 배열 100만개

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

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

좋은 웹페이지 즐겨찾기