for문 밖에 변수를 선언
했다.
for문 안에 변수를 선언
했다.
위와 같이 반복문 밖에 변수를 선언했을 경우와 반복문 안에 변수를 선언했을 경우를 비교했을 때, 성능
이 더 좋은 경우가 궁금했다.
https://okky.kr/article/1185275
솔직히 for문 안에 변수 선언 및 할당을 하는 것이 좋은지,
for문 밖에 변수 선언을 하고 for문 안에서는 변수 할당만
하는 것이 좋은지 정확히 알 수 없었다.
따라서 직접 간단한 테스트를 만들어 비교해보기로 했다.
http://codechacha.com/ko/java-performance-counter/
Java 코드 실행 시간 측정을 위해 어떤 코드를 써야 하는지에 대한 정보를 얻은 사이트이다. 이 중 System.currentTimeMillis()
를 사용했다.
변수를 for문 밖
에 선언
변수를 for문 안
에 선언
보다시피 해당 class의 main 메소드에 int 변수와 객체 변수를 선언하고, 이를 할당
하는 코드를 작성해서 테스트 했다.
1억번 반복을 시켰을 경우 for문 안에 변수를 선언하고 값을 할당한 경우가 172ms
가 빨랐다.
변수를 for문 밖
에 선언
변수를 for문 안
에 선언
for문 밖에 변수를 선언한 경우에 약 4초
, 3697ms
빠르다.
변수를 for문 밖
에 선언
변수를 for문 안
에 선언
for문 밖에 변수를 선언한 경우에 약 9초
,8685ms
빠르다.
[정리]
1. 솔직히 내부적으로 어떤 차이가 있는지 잘 모르겠다.
2. 혹자는 for문 안에서 변수 선언 및 할당을 하면
비효율 적인 작업이 발생한다고 말한다. (heap 영역에
객체가 많이 생성된다던지..)
3. 대부분 사람들은 컴파일러가 최적화 해주기 때문에
내부적으로 비슷하고, 성능 차이가 거의 없다고 한다.
4. 따라서 가독성 좋게 for문 안에 변수 선언 및
할당을 하도록 권하는 사람이 많았다.
5. for문 안에서 변수 선언 및 할당을 했을 경우 지역 변수로
사용되어 동작이 끝난 뒤 변수는 존재하지 않는다. 따라서 변수
사용 범위를 고려해 상황에 맞게 선택해야 한다.
더 복잡한 코드, 로직, 더 많은 반복 횟수로 테스트 했으면
유의미한 결과를 만들 수 있었을지 모르겠지만 아직 실력이..^^
관련 내용을 다루고 있는 링크
https://hyeonk-lab.tistory.com/44
StringBuilder
를 사용해봤다.
StringBuilder 사용법, 장점
https://hardlearner.tistory.com/288
String vs StringBuffer vs StringBuilder
https://velog.io/@new_wisdom/Java-String-vs-StringBuffer-vs-StringBuilder
StringBuilder vs StringBuffer
https://codingdog.tistory.com/entry/stringbuilder-vs-stringbuffer-%EB%8F%99%EC%A0%81-%EB%B0%B0%EC%97%B4%EC%9D%B8-%EA%B1%B4-%EA%B0%99%EC%9D%80%EB%8D%B0-%EB%AD%90%EA%B0%80-%EB%8B%A4%EB%A5%BC%EA%B9%8C
마지막으로 int 배열을 사용한 풀이와 StringBuilder를 사용한 풀이 중 무엇이 더 빠를지 궁금해졌다. int 배열이 빠를까
, StringBuilder가 빠를까?
StringBuilder
에 랜덤 숫자 백만개를 넣고 출력
int를 사용하기 위해서는 형변환 및 추가 작업이 필요해 double로 테스트
하게됐다. (int와 double 배열이 같은 속도일 것으로 추정).
결과는 1초 차이로 StringBuilder가 더 빨랐다.
StringBuilder
100만개
double 배열
100만개
6초 차이로 StringBuilder가 더 빠르다.
결론 : StringBuilder가 배열에 넣어서 출력하는 것 보다 더 빠르다.