GraalVM을 사용해보기

14450 단어 Scala자바graalvmJVM

이전



GraalVM의 퍼포먼스, 그리고는, Graal을 JIT 컴파일러로서 이용했을 때의 퍼포먼스에 포커스 한 기사이므로, GraalVM의 특징의 하나인 native image나, multiple languages등에 관해서는, 이 기사에서는 언급하고 있지 않다.

환경


  • macOS Mojava 10.14.4
  • Scala 2.13.1
  • sbt 1.3.8
  • GraalVM 20.1

  • 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에 관해 정리한다.

    참고


  • htps : // 메이 m. 이 m / g 등 lvm / g 등 lvm - 텐 - gs - 12d9111f307d
  • htps //w w. g 등 lvm. 오 rg / 드 cs / 에어 mp ぇ s / 그럼 ぁ ぺ r ぉ r
  • 좋은 웹페이지 즐겨찾기