😥 그저,,, 우린 "012345678"이라는 결과가 필요한데, 이런 메모리 소모를 겪지 않을 방법이 필요하다!
StringBuffer 클래스는 내부적으로 버퍼를 가지고 있습니다.
append 함수로 string을 붙여쓰면 버퍼에 추가됩니다.
따라서 스트링을 더할 때 stringBuffer나 StringBuilder를 쓰면 성능저하를 막을 수 있습니다 😃
그런데,, 그 둘의 차이는 뭘까용? 🤔
stringBuffer | stringBuilder | |
---|---|---|
동기화 여부 | 동기화 지원 | 동기화 미지원 |
싱글 스레드 속도차이 | 상대적 느림 | 상대적 빠름 |
storage | heap | heap |
가장 큰 차이는 stringBuffer는 동기화를 지원하고 stringBuilder는 지원하지 않는다는 것입니다.
따라서 멀티쓰레드라면, stringBuilder는 내가 원하는 결과를 주기 어려울수도 있습니다.. 😥
성능을 비교해볼까요??
/* 싱글쓰레드 환경에서 성능차이*/
StringBuffer stringBufferSingleThread = new StringBuffer();
StringBuilder stringBuilderSingleThread = new StringBuilder();
System.out.println("[SINGLE THREAD TEST]");
new Thread(()->{
long start = System.currentTimeMillis(); //측정시작
for(int i=0;i<20000;i++){
stringBufferSingleThread.append(i);
}
long end = System.currentTimeMillis(); //측정종료
System.out.println("StringBuffer length: " + stringBufferSingleThread.length() );
System.out.println("StringBuffer time: " + (end-start) );
}).start();
new Thread(()->{
long start = System.currentTimeMillis(); //측정시작
for(int i=0;i<20000;i++){
stringBuilderSingleThread.append(i);
}
long end = System.currentTimeMillis(); //측정종료
System.out.println("StringBuilder length: " + stringBuilderSingleThread.length() );
System.out.println("StringBuilder time: " + (end-start) );
}).start();
System.out.println("=================");
System.out.println("[MULTI THREAD TEST]");
/* 멀티쓰레드 환경에서 수행 횟수 차이 */
StringBuffer stringBufferMultiThread = new StringBuffer();
StringBuilder stringBuilderMultiThread = new StringBuilder();
//두 개의 쓰레드에서 각자 한 StringBuffer, StringBuilder에 접근
new Thread(()->{
for(int i=0;i<10000;i++){
stringBufferMultiThread.append(i);
stringBuilderMultiThread.append(i);
}
}).start();
new Thread(()->{
for(int i=0;i<10000;i++){
stringBufferMultiThread.append(i);
stringBuilderMultiThread.append(i);
}
}).start();
new Thread(()->{
try {
Thread.sleep(1000);
System.out.println("StringBuffer length : " + stringBufferMultiThread.length());
System.out.println("StringBuilder length : " + stringBuilderMultiThread.length());
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();