알고리즘 테스트 리뷰를 하던중
String 의 index 를 배열로 바꿀 때 어떤 방법이 효율이 좋을지 궁금증이 생겼다.
효율성을 테스트하기위해서 System.*nanoTime*()
를 이용했다.
시간 측정을 원하는 로직의 앞 뒤로 선언해준 뒤,
두 변수의 값의 차이를 비교해 확인하면 된다.
//-- 측정 준비 과정 --//
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 999999; i++)
sb.append("a");
String str = sb.toString();
//-- 측정 과정 --//
long start = System.nanoTime(); // 측정 시작
String[] split = str.split(""); // 측정하려는 로직
long end = System.nanoTime(); // 측정 종료
//-- 측정 결과 계산 과정 --//
double runningTime = (end - start) / 1000000.0;
System.out.println(runningTime);
측정 준비하기 위해 중복되는 코드를 제거하기 위해
측정 준비 과정은 별도의 method 로 분리했다.
private static String beforeEach() {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 999999; i++)
sb.append("a");
return sb.toString();
}
splite 에 빈 문자열을 넣어 String 배열로 바꾸는 방식이다.
신기하게 같은 로직인데도 돌릴 때 마다 시간 차이가 있었다.
평균적으로 100 ~ 120 정도 시간이 걸렸다.
단위는 1,000,000,000초 / 1000000.0 이다…
@Test
void split() {
String str = beforeEach();
long start = System.nanoTime();
String[] split = str.split("");
long end = System.nanoTime();
double runningTime = (end - start) / 1000000.0;
System.out.println(runningTime); // 100 - 120
}
String 의 글자를 char 로 변환해 array 로 바꿔주는 라이브러리이다.
결과는 0 ~ 3 정도로 대부분 0. 대가 나오고 가끔 2. 대가 나왔다.
split 와 비교했을때 최대 100 배 이상 차이가 나서 놀랐다.
@Test
void charArray() {
String str = beforeEach();
long start = System.nanoTime();
char[] chars = str.toCharArray();
long end = System.nanoTime();
double runningTime = (end - start) / 1000000.0;
System.out.println(runningTime); // 0 ~ 3
}
마지막으로 단순히 char 배열을 선언 후 for 문을 통해 값을 넣어주는 방식도 실험해 봤다.
알고리즘 문제를 풀때 라이브러리를 적게 쓰는 코드가 대부분 좋은 효율이 좋았었던 것 같아서 확인 해봤다.
결과는 9 ~ 10 정도로 toCharArray 보다 약 3배에서 10 배 정도 차이가 났지만,
split 에 비해선 압도적으로 빠른 결과가 나왔다.
@Test
void forLoop() {
String str = beforeEach();
long start = System.nanoTime();
char[] arr = new char[str.length()];
for (int i = 0; i < str.length(); i++) {
arr[i] = str.charAt(i);
}
long end = System.nanoTime();
double runningTime = (end - start) / 1000000.0;
System.out.println(runningTime); // 9 ~ 10
}
toCharArray > for 문 >>>> split