Java Compiler는 문자열 연산 최적화를 어떻게 진행하나요

kkambbak1·2024년 2월 5일
0

선요약

+ 연산자를 사용하면 버전에 따라서 최적화가 진행된다

String 연산은 1.4 버전까지 매우 비용이 많이 드는 연산이었다.
이후 J2SE 5.0 버전 부터 Compile 할 때 String 연산 작업을 StringBuilder 를 이용해 바이트 코드를 변경하여 최적화 해준다.
Java SE 9 버전 부터는 컴파일 시점에 바이트 코드를 변경하지 않고 런타임 시점에 String을 연산하는 전략을 바꿀 수 있도록 invokedynamic, StringConcatFactory을 사용하도록 변경했다.

https://p829911.tistory.com/18

JDK 8

String 연산 작업을 StringBuilder 를 이용해 바이트 코드를 변경하여 최적화 해준다

JDK 11

From Java 9 (Java Enhancement Proposal 280 or JEP 280) , the entire StringBuilder append sequence has been replaced with a simple invokedynamic (More on this in next section below) call to java.lang.invoke.StringConcatFactory, that will accept the values in the need of concatenation.

6가지의 전략이 있는데 default는 MH_INLINE_SIZE_EXACT이다.
-Djava.lang.invoke.stringConcat=<strategyName> 을 시스템 속성으로 지정하여 실행하면 이 전략을 변경할 수 있다.

  • BC_SB (ByteCode StringBuilder): 런타임 시 동일한 StringBuilder 바이트코드를 생성한다.
  • BC_SB_SIZED: StringBuilder에 필요한 용량을 추측하려고 시도한다. 그 외에는 이전 방식과 동일하다. 
  • BC_SB_SIZED_EXACT: StringBuilder를 사용하고, 필요한 용량을 정확히 계산한다. 필요한 용량을 계산하기 위해 모든 인수를 문자열로 변환한다. (int -> toString)
  • MH_SB_SIZED: MethodHandle을 기반으로 하고 StringBuilder API를 호출한다.
  • MH_SB_SIZED_EXACT: 이전과 유사하지만 StringBuilder의 용량을 정확히 계산한다.
  • MH_INLINE_SIZE_EXACT: 필요한 용량을 미리 계산하고, 전달된 인자들을 연결하여 byte 배열로 생성 후, String의 private 생성자를 이용하여 copy 없이 byte 배열을 전달하여 String 객체를 반환한다.

https://medium.com/javarevisited/java-compiler-optimization-for-string-concatenation-7f5237e5e6ed

profile
윤성

0개의 댓글