GraalVM을 사용해보기
이전
GraalVM의 퍼포먼스, 그리고는, Graal을 JIT 컴파일러로서 이용했을 때의 퍼포먼스에 포커스 한 기사이므로, GraalVM의 특징의 하나인 native image나, multiple languages등에 관해서는, 이 기사에서는 언급하고 있지 않다.
환경
GraalVM이란?
Java로 작성된 최신 JIT 컴파일러, Graal을 탑재한 VM이다.
GraalVM 공식 문서에 따르면 Graal은 다음과 같은 특징을 가지고 있습니다.
Graal 자체가 java로 구현되어 있기 때문에 표준 JIT 컴파일러로는 할 수 없었던 부분적인 이스케이프 분석 등의 강력한 최적화에 의해 Java 프로그램을 대폭 고속화할 수 있다
실제로 얼마나 빨라지는지는 후술한다.
덧붙여서, VM 변경하는 것은 귀찮다면, 이하의 옵션을 붙이는 것으로, JIT 컴파일러만 Graal로 바꿀 수도 있는 것 같다.
그러나, 참고 에 의하면 JDK10 이후로 밖에 사용할 수 없기 때문에 주의.
-XX:+UnlockExperimentalVMOptions -XX:+UseJVMCICompiler
특징은 이하의 자료에 정리하고 있다
h tps://d ゔぇ. 오, ぇ. 이 m/후에/d/1우 Kw_7dM-2SLQhn rM5cq4에 mL9yqDxh피/ぃぃ에w? 우 sp = 샤린 g
GraalVM 아키텍처
다음과 같은 아키텍처입니다.
표준 JVM에 비해 C2 부분이 Graal 컴파일러로 대체되고 있다.
Graal과 JVMCI 부분은 Java로 구현됩니다.
JVMCI
Java로 구현된 컴파일러를 동적 컴파일러로서 JVM에서 이용할 수 있도록 한 것.
실제로 사용해보기
설치
공식 문서 에 쓰여진 대로 한다.
macOS의 경우 여기
OpenJDK의 표준 VM과 GraalVM으로 속도 비교해보기
보다 상세한 속도 비교는 이 기사에 썼다.
275Mb의
GraalTest.txt
에 포함되어 있는 단어의 종류로부터 톱 10을 토해내는 프로그램을 실행한다.
$ ll
total 65368
-rw-r--r-- 1 kinsho staff 202B 5 31 14:04 FibTest.scala
-rw-r--r-- 1 kinsho staff 1.9K 5 31 17:13 GraalTest.scala
-rw-r--r-- 1 kinsho staff 275M 5 31 16:54 GraalTest.txt
drwxr-xr-x 4 kinsho staff 128B 5 31 14:28 project
drwxr-xr-x 5 kinsho staff 160B 5 31 14:35 target
위에서 설치한 GraalVM을 VM으로 이용.
$ java -version
openjdk version "1.8.0_252"
OpenJDK Runtime Environment (build 1.8.0_252-b09)
OpenJDK 64-Bit Server VM GraalVM CE 20.1.0 (build 25.252-b09-jvmci-20.1-b02, mixed mode)
이하, 실행 프로그램
GraalTest.scala
import java.io.File
import scala.annotation.tailrec
import scala.io.BufferedSource
object GraalTest extends App {
val fileName: String = "GraalTest.txt"
val encode: String = "UTF-8"
val source: BufferedSource = scala.io.Source.fromFile(fileName, encode)
val lines: Iterator[String] = source.getLines()
val sortedTextList = lines.toList.mkString(" ").split(" ").sorted.toList
val value = createMap(sortedTextList)
val top10Words = value.toList.sortBy(_._2).reverse.take(10)
def createMap(wordList: List[String]): Map[String, Long] = {
@tailrec
def loop(list: List[String], acc: Map[String, Long]): Map[String, Long] = {
wordList match {
case head :: tail if acc.isEmpty => {
loop(tail, acc + (head -> 1L))
}
case head :: tail => {
acc.get(head) match {
case Some(value) => {
loop(tail, acc.updated(head, value + 1L))
}
case None => {
loop(tail, acc + (head -> 1L))
}
}
}
case head :: Nil => {
acc.get(head) match {
case Some(value) => {
acc.updated(head, value + 1L)
}
case None => {
acc + (head -> 1L)
}
}
}
}
}
loop(wordList, Map.empty[String, Long])
}
}
결과
OpenJDK의 표준 VM에서는! ?
비교를 위해 OpenJDK의 표준 JIT 컴파일러를 사용하여 프로그램을 실행해 보겠습니다.
-XX:-UseJVMCICompiler
를 지정하면 OpenJDK의 표준 JIT 컴파일러를 사용할 수 있습니다..jvmopts
-XX:-UseJVMCICompiler
-Xmx8G
실행
$ /usr/bin/time sbt run GraalTest.scala
그러면 다음과 같은 결과가 얻어집니다.
JVM 결과
[info] running GraalTest
List((the,3297996), (and,2198664), (of,2198664), (you,1648998), (a,1648998), (in,1648998), (about,1099332), (always,1099332), (with,1099332), (how,1099332))
[success] Total time: 64 s (01:04), completed 2020/06/04 0:38:37
85.31 real 479.11 user 8.89 sys
GraalVM에서는! ?
위의 프로그램을 GraalVM에서 실행해보십시오.
.jvmopts
-Xmx8G
실행
$ /usr/bin/time sbt run GraalTest.scala
그러면 다음과 같은 결과가 얻어집니다.
GraalVM 결과
[info] running GraalTest
List((the,3297996), (and,2198664), (of,2198664), (you,1648998), (a,1648998), (in,1648998), (about,1099332), (always,1099332), (with,1099332), (how,1099332))
[success] Total time: 54 s, completed 2020/06/04 0:40:02
75.29 real 333.95 user 9.23 sys
GraalVM을 사용하는 것으로, 10s도 빨라지고 있는 것을 알 수 있다.
이것은 상당히 빨라지고 있습니다!!!!!
↓퍼포먼스 측정으로 사용한 코드들
htps : // 기주 b. 코 m / 킨 쇼 토모야 / ぉ 긴 f 등 st c c 젓가락 / t ree /
요약
현재의 JIT 컴파일러 대신 Graal을 이용하는 것은 사용할 수 있다면 사용해야한다.
다음은 GraalVM의 또 다른 특징인 native-image에 관해 정리한다.
참고
Reference
이 문제에 관하여(GraalVM을 사용해보기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kinshotomoya/items/39a821dd6a6a52202c0a텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)