티스토리 뷰
들어가며
회사에서 여유있을때 소스 리팩토링 좀 해보려고 한번씩 쭉 보고 있는데, 문자열 연결하는 부분이 거의 String.format으로 되어있었다.
특별히 이렇게 쓴 이유가 있을까??
이 방식이 다른 방법보다 속도나 성능면에서 우수한걸까??
라는 궁금증으로 시작해 찾아보게 되었다.
문자열 연결 방법 및 테스트
1. (+)연산자 (string + string)
2. StringBuilder
3. String.format
(concat, join 등등 여러 방법이 있지만 주로 사용하는 것들 세가지 정도만 테스트해봤다.)
@Test
public void 문자열_연결_테스트() {
final int COUNT = 1000000;
String header = "앞쪽에 붙일 문자열...";
String footer = "...뒤에 붙일 문자열";
String result;
long startTime;
startTime = System.currentTimeMillis();
for(int i = 0; i < COUNT; i++) {
result = header + "중간내용" + footer + "_" + i;
}
System.out.println("(+)연산자 : " + (System.currentTimeMillis() - startTime) + "ms");
startTime = System.currentTimeMillis();
StringBuilder stringBuilder = new StringBuilder();
for(int i = 0; i < COUNT; i++) {
stringBuilder.setLength(0);
stringBuilder.append(header)
.append("중간내용")
.append(footer)
.append("_")
.append(i);
result = stringBuilder.toString();
}
System.out.println("StringBuilder : " + (System.currentTimeMillis() - startTime) + "ms");
startTime = System.currentTimeMillis();
for(int i = 0; i < COUNT; i++) {
result = String.format("%s%s%s%s%s", header, "중간내용", footer, "_", i);
}
System.out.println("String.format : " + (System.currentTimeMillis() - startTime) + "ms");
}
// (+)연산자 : 126ms
// StringBuilder : 56ms
// String.format : 1367ms
1,000,000건 기준으로 StringBuilder가 56ms로 가장 빨랐지만 연결할 문자열이 많아질 경우 가독성은 좋아보이지 않는다.
건수가 많지 않을 경우, 속도차이는 미미했지만 String.format이 좀 더 느린 것을 볼 수 있다.
(ex. 100건 기준
(+)연산자 : 0ms
StringBuilder : 0ms
String.format : 4ms)
결론
//String.format 내부의 parse 메서드
private static Pattern fsPattern = Pattern.compile(formatSpecifier);
/**
* Finds format specifiers in the format string.
*/
private FormatString[] parse(String s) {
ArrayList<FormatString> al = new ArrayList<>();
Matcher m = fsPattern.matcher(s);
for (int i = 0, len = s.length(); i < len; ) {
if (m.find(i)) {
...
String.format은 첫번째 인자로 정규식을 받기 때문에 Pattern / Matcher 클래스를 생성해준다.
이후 정규식을 검증하는 과정을 거치는데 단순 문자열 연결일 경우 정규식 검증을 위한 클래스 생성과 검증 비용은 불필요하다고 생각한다.
특정 포멧이 필요한게 아니라 단순 문자열 연결일 경우에는 +연산자, StringBuilder를 사용하는 것이 좋다고 생각하며, 건수가 많지 않을 것으로 생각되면 +연산자를 사용해 가독성까지 챙기는게 좋다고 생각한다.
Reference
https://kylewbanks.com/blog/java-string-concatenation-vs-stringbuilder-vs-string-format-performance
https://redfin.engineering/java-string-concatenation-which-way-is-best-8f590a7d22a8
'JAVA' 카테고리의 다른 글
Date, Calendar 대신 LocalDate (0) | 2021.05.03 |
---|---|
List.sort(Comparator) - 숫자 정렬 (1, 2...) / 문자 + 숫자 정렬 (A01, A02...) (0) | 2020.11.29 |
HttpURLConnection GET/POST 전송 및 Test 방법 (4) | 2019.10.30 |
이진탐색(Binary Search)을 활용해 효율적으로 서치하기 (0) | 2018.12.10 |
이중for문, 중첩for문, 중첩된 반복문 활용하기 (0) | 2018.11.21 |
- Total
- Today
- Yesterday
- 다음 맵 api
- java
- 최솟값
- 프로그래머스
- 자바
- FrogJmp
- 문자열 내 마음대로 정렬하기
- 스프링 부트
- 타겟 넘버
- 완주하지 못한 선수
- 124 나라의 숫자
- K번째수
- 쇠막대기
- 파이팅코리아
- json
- cgv
- AWS
- 더 나은 내일
- API
- 카카오인턴
- 노션트렐로광고X
- 객체지향과 디자인패턴
- 예매 알림
- 기능개발
- Spring
- 알고리즘
- 텔레그램
- 안드로이드 스튜디오
- codility
- 맵 api
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |