{"id":19332,"date":"2022-04-30T04:16:49","date_gmt":"2022-04-30T02:16:49","guid":{"rendered":"http:\/\/blog.wenzlaff.de\/?p=19332"},"modified":"2022-04-30T16:02:12","modified_gmt":"2022-04-30T14:02:12","slug":"vergleich-graalvm-nativ-vs-herkoemmlich-mit-quarkus-auf-macos","status":"publish","type":"post","link":"http:\/\/blog.wenzlaff.de\/?p=19332","title":{"rendered":"Vergleich GraalVM nativ vs. herk\u00f6mmlich mit Quarkus auf MacOS"},"content":{"rendered":"<p>Heute mal ein Vergleich mit einem Beispiel-Quarkus-REST Service normal vs. nativ.<\/p>\n<p>Um die Gr\u00f6\u00dfe und die Buildzeit zu vergleichen. Hier das Ergebnis vorweg:<\/p>\n<pre>\r\n          Build       Start        Gr\u00f6\u00dfe\r\nnormal    4,00 s     0,625 s          4588 Byte\r\nnativ    53,47 s     0,018 s     39,126296 MB\r\n<\/pre>\n<p>Also native gebaute Apps sind wesentlich l\u00e4nger zur Buildzeit daf\u00fcr laufen sie aber auch wesentlich schneller und sind dann auch auf das jeweilige Betriebssystem beschr\u00e4nkt.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2022\/04\/carpe-diem-hair-symbol.png\" alt=\"\" width=\"1920\" height=\"1080\" class=\"aligncenter size-full wp-image-19333\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2022\/04\/carpe-diem-hair-symbol.png 1920w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2022\/04\/carpe-diem-hair-symbol-300x169.png 300w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2022\/04\/carpe-diem-hair-symbol-1024x576.png 1024w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2022\/04\/carpe-diem-hair-symbol-768x432.png 768w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2022\/04\/carpe-diem-hair-symbol-1536x864.png 1536w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><br \/>\nUm auf einen MacOs Quarkus auch nativ zu kompilieren muss die GraalVM und das Native-Image installiert sein.<\/p>\n<p>Also installieren wir die GraalVM auf dem Mac mit Port:<!--more--><\/p>\n<pre class=\"lang:default decode:true \" >sudo port install openjdk11-graalvm<\/pre>\n<p>wie auch <a href=\"https:\/\/ports.macports.org\/search\/?installed_file=&#038;q=graalvm&#038;name=on\" rel=\"noopener\" target=\"_blank\">hier<\/a> beschrieben:<\/p>\n<p># Und den gu (GraalVM updater) installieren mit<\/p>\n<pre class=\"lang:default decode:true \" >\r\nsudo gu install native-image\r\n<\/pre>\n<p>Dann tragen wir noch die Java Version in der <strong>~\/.bash_profile<\/strong> ein, f\u00fcr das neue Java Home<\/p>\n<pre class=\"lang:default decode:true \" >JAVA_HOME=\/Library\/Java\/JavaVirtualMachines\/openjdk11-graalvm\/Contents\/Home<\/pre>\n<p># Noch die Bash neu starten und testen<br \/>\n<strong>java &#8211;version<\/strong><br \/>\n#ok  installiert<br \/>\nopenjdk 11.0.14 2022-01-18<br \/>\nOpenJDK Runtime Environment GraalVM CE 22.0.0.2 (build 11.0.14+9-jvmci-22.0-b05)<br \/>\nOpenJDK 64-Bit Server VM GraalVM CE 22.0.0.2 (build 11.0.14+9-jvmci-22.0-b05, mixed mode, sharing)<\/p>\n<p># oder alle Versionen und Pfade anzeigen und testen<br \/>\n<strong>\/usr\/libexec\/java_home -V<\/strong><\/p>\n<p>So, die Vorarbeiten sind nun getan. Dann mal ein Vergleich mit dem REST-Server der CO2-Ampel:<\/p>\n<p>Erst mal das Beispiel-Quarkus-Projekt mit git clonen:<\/p>\n<pre class=\"lang:default decode:true \" >git clone https:\/\/gitlab.com\/IT-Berater\/quarkus-rest-co2-beispiel.git<\/pre>\n<p>Dann das Native Package bauen:<\/p>\n<p><strong>mvn clean package -Pnative<\/strong><\/p>\n<p># Das dauert:<br \/>\n[INFO] [io.quarkus.deployment.QuarkusAugmentor] Quarkus augmentation completed in 50724ms<br \/>\n[INFO] &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n[INFO] BUILD SUCCESS<br \/>\n[INFO] &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n[INFO] Total time:  53.475 s<\/p>\n<p>Hier mal ein ausf\u00fchrliches Log, \u00fcber 1 Minute mit Details:<\/p>\n<pre class=\"theme:dark-terminal minimize:true lang:default decode:true \" >mvn clean package -Pnative\r\n[INFO] Scanning for projects...\r\n[INFO]\r\n[INFO] ----------------&lt; de.wenzlaff.info:co2-ampel-beispiel &gt;-----------------\r\n[INFO] Building co2-ampel-beispiel 1.0-SNAPSHOT\r\n[INFO] --------------------------------[ jar ]---------------------------------\r\n[INFO]\r\n[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ co2-ampel-beispiel ---\r\n[INFO] Deleting \/Users\/thomaswenzlaff\/git\/quarkus-rest-co2-beispiel\/target\r\n[INFO]\r\n[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ co2-ampel-beispiel ---\r\n[INFO] Using 'UTF-8' encoding to copy filtered resources.\r\n[INFO] Copying 2 resources\r\n[INFO]\r\n[INFO] --- maven-compiler-plugin:3.10.1:compile (default-compile) @ co2-ampel-beispiel ---\r\n[INFO] Changes detected - recompiling the module!\r\n[INFO] Compiling 1 source file to \/Users\/thomaswenzlaff\/git\/quarkus-rest-co2-beispiel\/target\/classes\r\n[INFO]\r\n[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ co2-ampel-beispiel ---\r\n[INFO] Using 'UTF-8' encoding to copy filtered resources.\r\n[INFO] skip non existing resourceDirectory \/Users\/thomaswenzlaff\/git\/quarkus-rest-co2-beispiel\/src\/test\/resources\r\n[INFO]\r\n[INFO] --- maven-compiler-plugin:3.10.1:testCompile (default-testCompile) @ co2-ampel-beispiel ---\r\n[INFO] Changes detected - recompiling the module!\r\n[INFO] Compiling 1 source file to \/Users\/thomaswenzlaff\/git\/quarkus-rest-co2-beispiel\/target\/test-classes\r\n[INFO]\r\n[INFO] --- maven-surefire-plugin:2.22.0:test (default-test) @ co2-ampel-beispiel ---\r\n[INFO]\r\n[INFO] -------------------------------------------------------\r\n[INFO]  T E S T S\r\n[INFO] -------------------------------------------------------\r\n[INFO] Running de.wenzlaff.InfoResourceTest\r\n2022-04-30 15:57:16,720 INFO  [org.jbo.threads] (main) JBoss Threads version 3.4.2.Final\r\n2022-04-30 15:57:17,711 INFO  [io.quarkus] (main) Quarkus 2.8.1.Final on JVM started in 1.420s. Listening on: http:\/\/localhost:8081\r\n2022-04-30 15:57:17,712 INFO  [io.quarkus] (main) Profile test activated.\r\n2022-04-30 15:57:17,712 INFO  [io.quarkus] (main) Installed features: [cdi, resteasy, smallrye-context-propagation, vertx]\r\n[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 4.11 s - in de.wenzlaff.InfoResourceTest\r\n2022-04-30 15:57:18,877 INFO  [io.quarkus] (main) Quarkus stopped in 0.032s\r\n[INFO]\r\n[INFO] Results:\r\n[INFO]\r\n[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0\r\n[INFO]\r\n[INFO]\r\n[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ co2-ampel-beispiel ---\r\n[INFO] Building jar: \/Users\/thomaswenzlaff\/git\/quarkus-rest-co2-beispiel\/target\/co2-ampel-beispiel-1.0-SNAPSHOT.jar\r\n[INFO]\r\n[INFO] --- quarkus-maven-plugin:2.8.1.Final:build (default) @ co2-ampel-beispiel ---\r\n[INFO] [io.quarkus.deployment.pkg.steps.JarResultBuildStep] Building native image source jar: \/Users\/thomaswenzlaff\/git\/quarkus-rest-co2-beispiel\/target\/co2-ampel-beispiel-1.0-SNAPSHOT-native-image-source-jar\/co2-ampel-beispiel-1.0-SNAPSHOT-runner.jar\r\n[INFO] [io.quarkus.deployment.pkg.steps.NativeImageBuildStep] Building native image from \/Users\/thomaswenzlaff\/git\/quarkus-rest-co2-beispiel\/target\/co2-ampel-beispiel-1.0-SNAPSHOT-native-image-source-jar\/co2-ampel-beispiel-1.0-SNAPSHOT-runner.jar\r\n[INFO] [io.quarkus.deployment.pkg.steps.NativeImageBuildStep] Running Quarkus native-image plugin on GraalVM 22.0.0.2 Java 11 CE (Java Version 11.0.14+9-jvmci-22.0-b05)\r\n[INFO] [io.quarkus.deployment.pkg.steps.NativeImageBuildRunner] \/Library\/Java\/JavaVirtualMachines\/openjdk11-graalvm\/Contents\/Home\/bin\/native-image -J-Djava.util.logging.manager=org.jboss.logmanager.LogManager -J-Dsun.nio.ch.maxUpdateArraySize=100 -J-Dvertx.logger-delegate-factory-class-name=io.quarkus.vertx.core.runtime.VertxLogDelegateFactory -J-Dvertx.disableDnsResolver=true -J-Dio.netty.leakDetection.level=DISABLED -J-Dio.netty.allocator.maxOrder=3 -J-Duser.language=de -J-Duser.country=DE -J-Dfile.encoding=UTF-8 -H:-ParseOnce -J--add-exports=java.security.jgss\/sun.security.krb5=ALL-UNNAMED -J--add-opens=java.base\/java.text=ALL-UNNAMED -H:InitialCollectionPolicy=com.oracle.svm.core.genscavenge.CollectionPolicy\\$BySpaceAndTime -H:+JNI -H:+AllowFoldMethods -J-Djava.awt.headless=true -H:FallbackThreshold=0 -H:+ReportExceptionStackTraces -H:-AddAllCharsets -H:EnableURLProtocols=http -H:-UseServiceLoaderFeature -H:+StackTrace co2-ampel-beispiel-1.0-SNAPSHOT-runner -jar co2-ampel-beispiel-1.0-SNAPSHOT-runner.jar\r\n========================================================================================================================\r\nGraalVM Native Image: Generating 'co2-ampel-beispiel-1.0-SNAPSHOT-runner'...\r\n========================================================================================================================\r\n[1\/7] Initializing...                                                                                    (8,1s @ 0,26GB)\r\n Version info: 'GraalVM 22.0.0.2 Java 11 CE'\r\n 3 user-provided feature(s)\r\n  - io.quarkus.runner.AutoFeature\r\n  - io.quarkus.runtime.graal.DisableLoggingAutoFeature\r\n  - io.quarkus.runtime.graal.ResourcesFeature\r\n[2\/7] Performing analysis...  [**********]                                                              (15,7s @ 1,40GB)\r\n   9.692 (94,34%) of 10.274 classes reachable\r\n  14.500 (64,25%) of 22.568 fields reachable\r\n  48.200 (81,52%) of 59.128 methods reachable\r\n     419 classes,    18 fields, and   724 methods registered for reflection\r\n      68 classes,    89 fields, and    54 methods registered for JNI access\r\n[3\/7] Building universe...                                                                               (1,4s @ 1,78GB)\r\n[4\/7] Parsing methods...      [*]                                                                        (1,9s @ 3,33GB)\r\n[5\/7] Inlining methods...     [*****]                                                                    (4,2s @ 3,66GB)\r\n[6\/7] Compiling methods...    [****]                                                                    (14,8s @ 3,95GB)\r\n[7\/7] Creating image...                                                                                  (3,7s @ 1,28GB)\r\n  18,34MB (45,31%) for code area:   32.059 compilation units\r\n  18,61MB (45,97%) for image heap:   6.655 classes and 256.791 objects\r\n   3,53MB ( 8,72%) for other data\r\n  40,49MB in total\r\n------------------------------------------------------------------------------------------------------------------------\r\nTop 10 packages in code area:                               Top 10 object types in image heap:\r\n   1,65MB sun.security.ssl                                     6,16MB byte[] for general heap data\r\n 965,61KB java.util                                            2,30MB java.lang.Class\r\n 686,92KB com.sun.crypto.provider                              1,97MB java.lang.String\r\n 490,01KB sun.security.x509                                    1,51MB byte[] for java.lang.String\r\n 422,71KB io.netty.buffer                                    572,72KB java.util.HashMap$Node\r\n 395,96KB java.util.concurrent                               390,66KB java.lang.String[]\r\n 376,22KB java.lang                                          364,73KB com.oracle.svm.core.util.LazyFinalReference\r\n 367,17KB java.io                                            330,81KB java.util.HashMap$Node[]\r\n 358,64KB com.oracle.svm.core.reflect                        311,53KB java.util.LinkedHashMap\r\n 352,91KB io.netty.handler.codec.http2                       295,75KB byte[] for method metadata\r\n      ... 368 additional packages                                 ... 2360 additional object types\r\n                                           (use GraalVM Dashboard to see all)\r\n------------------------------------------------------------------------------------------------------------------------\r\n                        3,9s (7,3% of total time) in 28 GCs | Peak RSS: 6,47GB | CPU load: 9,41\r\n------------------------------------------------------------------------------------------------------------------------\r\nProduced artifacts:\r\n \/Users\/thomaswenzlaff\/git\/quarkus-rest-co2-beispiel\/target\/co2-ampel-beispiel-1.0-SNAPSHOT-native-image-source-jar\/co2-ampel-beispiel-1.0-SNAPSHOT-runner (executable)\r\n \/Users\/thomaswenzlaff\/git\/quarkus-rest-co2-beispiel\/target\/co2-ampel-beispiel-1.0-SNAPSHOT-native-image-source-jar\/co2-ampel-beispiel-1.0-SNAPSHOT-runner.build_artifacts.txt\r\n========================================================================================================================\r\nFinished generating 'co2-ampel-beispiel-1.0-SNAPSHOT-runner' in 53,3s.\r\n[INFO] [io.quarkus.deployment.QuarkusAugmentor] Quarkus augmentation completed in 56222ms\r\n[INFO] ------------------------------------------------------------------------\r\n[INFO] BUILD SUCCESS\r\n[INFO] ------------------------------------------------------------------------\r\n[INFO] Total time:  01:04 min\r\n[INFO] Finished at: 2022-04-30T15:58:16+02:00\r\n[INFO] ------------------------------------------------------------------------<\/pre>\n<p>Das starten des nativ gebauten Programm:<\/p>\n<p><strong>.\/co2-ampel-beispiel-1.0-SNAPSHOT-runner<\/strong><\/p>\n<pre class=\"lang:default decode:true \" >__  ____  __  _____   ___  __ ____  ______\r\n --\/ __ \\\/ \/ \/ \/ _ | \/ _ \\\/ \/\/_\/ \/ \/ \/ __\/\r\n -\/ \/_\/ \/ \/_\/ \/ __ |\/ , _\/ ,&lt; \/ \/_\/ \/\\ \\\r\n--\\___\\_\\____\/_\/ |_\/_\/|_\/_\/|_|\\____\/___\/\r\n2022-04-29 18:07:00,721 INFO  [io.quarkus] (main) co2-ampel-beispiel 1.0-SNAPSHOT native (powered by Quarkus 2.8.1.Final) started in 0.018s. Listening on: http:\/\/0.0.0.0:8080\r\n2022-04-29 18:07:00,721 INFO  [io.quarkus] (main) Profile prod activated.\r\n2022-04-29 18:07:00,721 INFO  [io.quarkus] (main) Installed features: [cdi, resteasy, smallrye-context-propagation, vertx]\r\n<\/pre>\n<p>im Gegensatz zu dem Normalen:<\/p>\n<p><strong>mvn clean package<\/strong><\/p>\n<p>Total time:  4.006 s<\/p>\n<p>Da ist das Jar im Target Verzeichnis<br \/>\nnur 4588 Byte gro\u00df (info-kleinhirn-1.0-SNAPSHOT.jar) das Native hingegen<br \/>\n39.126.296 MB (info-kleinhirn-1.0-SNAPSHOT-runner). Daf\u00fcr startet er aber auch nativ in 18 ms:<\/p>\n<p><strong>.\/info-kleinhirn-1.0-SNAPSHOT-runner<\/strong><\/p>\n<pre class=\"lang:default decode:true \" >__  ____  __  _____   ___  __ ____  ______\r\n --\/ __ \\\/ \/ \/ \/ _ | \/ _ \\\/ \/\/_\/ \/ \/ \/ __\/\r\n -\/ \/_\/ \/ \/_\/ \/ __ |\/ , _\/ ,&lt; \/ \/_\/ \/\\ \\\r\n--\\___\\_\\____\/_\/ |_\/_\/|_\/_\/|_|\\____\/___\/\r\n2022-04-24 19:13:32,274 INFO  [io.quarkus] (main) info-kleinhirn 1.0-SNAPSHOT native (powered by Quarkus 2.8.1.Final) started in 0.018s. Listening on: http:\/\/0.0.0.0:8080\r\n2022-04-24 19:13:32,275 INFO  [io.quarkus] (main) Profile prod activated.\r\n2022-04-24 19:13:32,275 INFO  [io.quarkus] (main) Installed features: [cdi, resteasy, smallrye-context-propagation, vertx]<\/pre>\n<p>Ein normaler Start:<\/p>\n<p><strong> java -jar quarkus-app\/quarkus-run.jar<\/strong><\/p>\n<pre class=\"lang:default decode:true \" >__  ____  __  _____   ___  __ ____  ______\r\n --\/ __ \\\/ \/ \/ \/ _ | \/ _ \\\/ \/\/_\/ \/ \/ \/ __\/\r\n -\/ \/_\/ \/ \/_\/ \/ __ |\/ , _\/ ,&lt; \/ \/_\/ \/\\ \\\r\n--\\___\\_\\____\/_\/ |_\/_\/|_\/_\/|_|\\____\/___\/\r\n2022-04-29 18:10:20,159 INFO  [io.quarkus] (main) co2-ampel-beispiel 1.0-SNAPSHOT on JVM (powered by Quarkus 2.8.1.Final) started in 0.625s. Listening on: http:\/\/0.0.0.0:8080\r\n2022-04-29 18:10:20,175 INFO  [io.quarkus] (main) Profile prod activated.\r\n2022-04-29 18:10:20,175 INFO  [io.quarkus] (main) Installed features: [cdi, resteasy, smallrye-context-propagation, vertx]\r\n\r\n<\/pre>\n<p><a href=\"https:\/\/quarkus.io\/guides\/maven-tooling\" rel=\"noopener\" target=\"_blank\">weitere Infos zum Tooling.<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Heute mal ein Vergleich mit einem Beispiel-Quarkus-REST Service normal vs. nativ. Um die Gr\u00f6\u00dfe und die Buildzeit zu vergleichen. Hier das Ergebnis vorweg: Build Start Gr\u00f6\u00dfe normal 4,00 s 0,625 s 4588 Byte nativ 53,47 s 0,018 s 39,126296 MB Also native gebaute Apps sind wesentlich l\u00e4nger zur Buildzeit daf\u00fcr laufen sie aber auch wesentlich &hellip; <\/p>\n<p class=\"link-more\"><a href=\"http:\/\/blog.wenzlaff.de\/?p=19332\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eVergleich GraalVM nativ vs. herk\u00f6mmlich mit Quarkus auf MacOS\u201c <\/span>weiterlesen<\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[220,3161,4084,4,5,3423,3163,3769],"tags":[112,527,4057,66,2099,5222,3764],"class_list":["post-19332","post","type-post","status-publish","format-standard","hentry","category-anleitung","category-build","category-co2","category-eclipse","category-java","category-java-11","category-maven","category-quarkus-framework","tag-beispiel","tag-co2","tag-co2ampel","tag-maven","tag-mvn","tag-nativ","tag-quarkus"],"_links":{"self":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts\/19332","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=19332"}],"version-history":[{"count":0,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts\/19332\/revisions"}],"wp:attachment":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=19332"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=19332"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=19332"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}