Introduction

This is a comparison of a simple online demo photobook implemented with three popular java cloud ready framework :

Status : Work in progess

TODO:

  • benchmark chapter

  • performance comparison chapter

  • resources chapter

Turbo Photobook Goals
Failed to generate image: mmdc failed: Generating single mermaid chart

mindmap
  root((Comparison<br/>goals))
    Deployment
      ::icon(fa fa-paper-plane)
      Java Hotspot jar package JIT
      GraalVM native executable AOT
      Containerized JIT application
      Containerized AOT application
    Java Frameworks
      ::icon(fa fa-mug-hot)
      Micronaut
      Quarkus
      Spring Boot

Copyright

@2024 Matteo Franci - CC BY 4.0 - ATTRIBUTION 4.0 INTERNATIONAL - https://creativecommons.org/licenses/by-nc-sa/4.0/deed.en

All trademarks, logos and brand names are the property of their respective owners. All company, product and service names used in this website are for identification purposes only. Use of these names,trademarks and brands does not imply endorsement.

1. Architecture

This section describes the project architecture.

Turbo Photobook Mind Map
Failed to generate image: mmdc failed: Generating single mermaid chart

mindmap
  root((<br/>Turbo<br/>Photobook))
    Documentation
    ::icon(fa fa-file)
      Asciidoc
      ::icon(fa fa-book)
        Mermaid
        ::icon(fa fa-chart-line)
    Implementation
      ::icon(fa fa-code)
      MongoDB 8
      ::icon(fa fa-leaf)
      Node JS 20
      ::icon(fa fa-cube)
        Vite
        React
      GraalVM Java 21<br>&lpar;pick one&rpar;
      ::icon(fa fa-mug-hot)
         Micronaut
         Quarkus
         Spring Boot
    Deployment
      ::icon(fa fa-paper-plane)
      Java Hotspot jar package JIT
      GraalVM native executable AOT
      Containerized JIT application
      Containerized AOT application
Software Architecture
Failed to generate image: mmdc failed: Generating single mermaid chart

block-beta
columns 2
block:per:2
    columns 2
    persistance["Persistance"]:1
    mongo[("MongoDB")]
    style per fill:#9d9,stroke:#333,stroke-width:4px
end
blockArrowLink<["Uses"]>(up, down):2
block:app
        columns 2
        application["application"]:2
        rest["API Rest"]
        backend(["Java Framework<br/>(Micronaut, Quarkus, Spring Boot)"]):1
        ui["User interface"]
        react(["React<br/>Single Page Application"]):1
        style backend fill:#fdd,stroke:#333,stroke-width:4px
        style app fill:#99d,stroke:#333,stroke-width:4px
    end

2. Implementation

Each implementation has its own repository :

Framework GitHub repository Description

Micronaut

fugerit-org/micronaut-photobook

A modern, jvm-based, full-stack framework for building modular, easily testable microservice and serverless applications.

Quarkus

fugerit-org/quarkus-photobook

A Kubernetes Native Java stack tailored for OpenJDK HotSpot and GraalVM, crafted from the best of breed Java libraries and standards.

Spring Boot

fugerit-org/springboot-photobook

Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can "just run".

Each project structure is based on Maven Standard Directory Layout :

path description

src/main/java

Application (Micronaut / Quarkus / Spring Boot) sources

src/main/resources

Application (Micronaut / Quarkus / Spring Boot) resources

src/main/react

React front end sources

src/test/java

Test sources

src/test/resources

Test resources

src/main/docker

Dockerfile (JIT, native), docker-compose

src/main/script

Project scripts (simple benchmark and utilities)

src/main/docs

Project specific documentation assets

README.md

Readme

CHANGELOG.md

Changelog (keep a changelog style)

LICENSE

License

CONTRIBUTING.md

Contribution guide lines

Feature Micronaut Quarkus Spring Boot

Version

4.10.x

3.31.x

3.5.x

Java

21

21

21

Virtual threads

Yes

Yes

Yes

HTTP 2

Yes

Yes

Yes

Cache

Caffeine

Caffeine

ConcurrentMap

Native image

GraalVM

GraalVM

GraalVM

Containerized JIT

Yes

Yes

Yes

Containerized AOT

Yes

Yes

Yes

2.1. MongoDB collection definitions

Persistence layer is implemented through the no sql database MongoDB.

Collection schema
Failed to generate image: mmdc failed: Generating single mermaid chart

erDiagram
    PHOTOBOOK_META ||--o{ PHOTOBOOK_IMAGES : contains

Here are two sample documents :

Collection : photobook_meta - sample document
{
    "photobookId":"springio23",
    "creationTime:":{"$timestamp":{"t":0,"i":0}},
    "modificationTime:":{"$timestamp":{"t":0,"i":0}},
    "author":"Fugerit",
    "labels": {
        "def": {
            "photobookTitle":"Spring I/O - Barcellona",
            "photobookDescription":"Breve album sull'esperienza allo Spring I/O 2023 di Barcellona"
        },
        "en": {
            "photobookTitle":"Spring I/O - Barcelona",
            "photobookDescription":"Brief summary of my experience at the Barcelona Spring I/O 2023"
        }
    }
}
Collection : photobook_images - sample document
{
        "imageId":1000,
        "photobookId":"springio23",
        "creationTime:":{"$timestamp":{"t":0,"i":0}},
        "modificationTime:":{"$timestamp":{"t":0,"i":0}},
        "author":"Fugerit",
        "base64":"...",
        "type":"jpg",
        "labels": {
            "def": {
                "caption":"Ingresso alla \"Fira de Barcelona\" per la registrazione."

            },
            "en": {
                "caption":"Entrance to the \"Fira de Barcelona\" for registration."
            }
        }
    }

2.2. MongoDB aggregation pipelines

Database queries are implemented though MongoDB Aggregation pipelines.

Aggregations pipelines allow to process a document in multiple steps (stages).

Here are the aggregations currently used :

  1. List photobooks

Applied to collection 'photobook_meta', list the photobooks contained in the database with page handling.

It is composed of some stages :

  • set labels based on language

  • sort the collection result

  • project the properties for the result (_id is excluded)

  • facet with meta informations for page handling

Aggrefation pipeline - list photobooks
 [
  {
    $set:
      {
        info: {
          $ifNull: ["$labels.en", "$labels.def"],
        },
      },
  },
  {
    $sort:
      {
        photobookId: 1,
      },
  },
  {
    $project:
      {
        _id: 0,
        photobookId: 1,
        author: 1,
        info: 1,
      },
  },
  {
    $facet:
      {
        metadata: [
          {
            $count: "total",
          },
          {
            $addFields: {
              page: NumberInt(1),
            },
          },
        ],
        data: [
          {
            $skip: 0,
          },
          {
            $limit: 10,
          },
        ],
      },
  },
]
  1. List images in a photobook

Applied to collection 'photobook_images', list images contained in photobook with page handling.

It is composed of some stages :

  • match filter the selected photobook

  • sort the collection result

  • set labels based on language

  • project the properties for the result (_id is excluded, base64 is not included too)

  • facet with meta informations for page handling

Aggregation pipeline - list images for a photobook
[
  {
    $match: {
      photobookId: "springio23",
    },
  },
  {
    $sort:
      {
        imageId: 1,
      },
  },
  {
    $set: {
      info: {
        $ifNull: ["$labels.en", "$labels.def"],
      },
    },
  },
  {
    $project: {
	  _id:0,
	  imageId:1,
	  author:1,
	  type:1,
	  info:1
    },
  },
  {
    $facet: {
      metadata: [
        {
          $count: "total",
        },
        {
          $addFields: {
            page: NumberInt(1),
          },
        },
      ],
      data: [
        {
          $skip: 0,
        },
        {
          $limit: 30,
        },
      ],
    },
  },
]
  1. Image base64 content

Applied to collection 'photobook_images', retrieves only the base64 content for rendering.

It is composed of some stages :

  • match filter the selected image

  • project the properties for the result (only base64 content)

Aggregation pipeline - retrieves image content
[
 {
   $match:
     {
       imageId: 1000,
       photobookId: "springio23",
     },
 },
 {
   $project:
     {
       _id: 0,
       base64: 1,
     },
 },
]

3. Benchmark (no resource limit)

This is a simple comparison benchmark between the same scenario for SpringBoot, Quarkus and Micronaut, both in JIT and AOT (GraalVM) version.

The specs of the system used for the runs are

  • AMD Ryzen 7 3700X 8 Core / 16 Threads

  • 32 GB Memory

  • Ubuntu 24 OS

  • NVME disk

  • MongoDB 8.2.3 running as container and already initialized

The benchmark tool used is hey together with psrecord for plotting.

Each run is composed of 250.000 request (two times, first for warm up, second for benchmark), with 8 connections.

Each sample shows the hey command result and the psrecord plotted image.

In this scenario, no resource cap has been set

3.1. SpringBoot JIT Benchmark

Summary:
  Total:        44.2034 secs
  Slowest:      0.0107 secs
  Fastest:      0.0006 secs
  Average:      0.0014 secs
  Requests/sec: 5655.6790


Response time histogram:
  0.001 [1]     |
  0.002 [185744]        |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  0.003 [63096] |■■■■■■■■■■■■■■
  0.004 [828]   |
  0.005 [133]   |
  0.006 [77]    |
  0.007 [67]    |
  0.008 [12]    |
  0.009 [25]    |
  0.010 [12]    |
  0.011 [5]     |


Latency distribution:
  10% in 0.0011 secs
  25% in 0.0012 secs
  50% in 0.0014 secs
  75% in 0.0016 secs
  90% in 0.0018 secs
  95% in 0.0019 secs
  99% in 0.0023 secs

Details (average, fastest, slowest):
  DNS+dialup:   0.0000 secs, 0.0006 secs, 0.0107 secs
  DNS-lookup:   0.0000 secs, 0.0000 secs, 0.0007 secs
  req write:    0.0000 secs, 0.0000 secs, 0.0010 secs
  resp wait:    0.0014 secs, 0.0005 secs, 0.0106 secs
  resp read:    0.0000 secs, 0.0000 secs, 0.0020 secs

Status code distribution:
  [200] 250000 responses
SpringBoot JIT Benchmark

3.2. SpringBoot AOT Benchmark

Summary:
  Total:        49.0908 secs
  Slowest:      0.0162 secs
  Fastest:      0.0007 secs
  Average:      0.0016 secs
  Requests/sec: 5092.6056


Response time histogram:
  0.001 [1]     |
  0.002 [235922]        |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  0.004 [12357] |■■
  0.005 [459]   |
  0.007 [160]   |
  0.008 [756]   |
  0.010 [236]   |
  0.012 [82]    |
  0.013 [17]    |
  0.015 [4]     |
  0.016 [6]     |


Latency distribution:
  10% in 0.0011 secs
  25% in 0.0013 secs
  50% in 0.0015 secs
  75% in 0.0017 secs
  90% in 0.0020 secs
  95% in 0.0023 secs
  99% in 0.0033 secs

Details (average, fastest, slowest):
  DNS+dialup:   0.0000 secs, 0.0007 secs, 0.0162 secs
  DNS-lookup:   0.0000 secs, 0.0000 secs, 0.0011 secs
  req write:    0.0000 secs, 0.0000 secs, 0.0017 secs
  resp wait:    0.0015 secs, 0.0006 secs, 0.0161 secs
  resp read:    0.0000 secs, 0.0000 secs, 0.0121 secs

Status code distribution:
  [200] 250000 responses
SpringBoot AOT Benchmark

3.3. Quarkus JIT Benchmark

Summary:
  Total:        42.1730 secs
  Slowest:      0.0372 secs
  Fastest:      0.0006 secs
  Average:      0.0013 secs
  Requests/sec: 5927.9662

  Total data:   46000000 bytes
  Size/request: 184 bytes

Response time histogram:
  0.001 [1]     |
  0.004 [249721]        |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  0.008 [201]   |
  0.012 [28]    |
  0.015 [22]    |
  0.019 [11]    |
  0.023 [0]     |
  0.026 [8]     |
  0.030 [0]     |
  0.034 [0]     |
  0.037 [8]     |


Latency distribution:
  10% in 0.0010 secs
  25% in 0.0012 secs
  50% in 0.0013 secs
  75% in 0.0015 secs
  90% in 0.0017 secs
  95% in 0.0018 secs
  99% in 0.0023 secs

Details (average, fastest, slowest):
  DNS+dialup:   0.0000 secs, 0.0006 secs, 0.0372 secs
  DNS-lookup:   0.0000 secs, 0.0000 secs, 0.0005 secs
  req write:    0.0000 secs, 0.0000 secs, 0.0013 secs
  resp wait:    0.0013 secs, 0.0005 secs, 0.0370 secs
  resp read:    0.0000 secs, 0.0000 secs, 0.0014 secs

Status code distribution:
  [200] 250000 responses
SpringBoot AOT Benchmark

3.4. Quarkus AOT Benchmark

Summary:
  Total:        45.0965 secs
  Slowest:      0.0146 secs
  Fastest:      0.0006 secs
  Average:      0.0014 secs
  Requests/sec: 5543.6629

  Total data:   46000000 bytes
  Size/request: 184 bytes

Response time histogram:
  0.001 [1]     |
  0.002 [237795]        |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  0.003 [10090] |■■
  0.005 [473]   |
  0.006 [1290]  |
  0.008 [274]   |
  0.009 [52]    |
  0.010 [17]    |
  0.012 [7]     |
  0.013 [0]     |
  0.015 [1]     |


Latency distribution:
  10% in 0.0011 secs
  25% in 0.0012 secs
  50% in 0.0014 secs
  75% in 0.0016 secs
  90% in 0.0018 secs
  95% in 0.0020 secs
  99% in 0.0031 secs

Details (average, fastest, slowest):
  DNS+dialup:   0.0000 secs, 0.0006 secs, 0.0146 secs
  DNS-lookup:   0.0000 secs, 0.0000 secs, 0.0004 secs
  req write:    0.0000 secs, 0.0000 secs, 0.0010 secs
  resp wait:    0.0014 secs, 0.0006 secs, 0.0145 secs
  resp read:    0.0000 secs, 0.0000 secs, 0.0008 secs

Status code distribution:
  [200] 250000 responses
SpringBoot AOT Benchmark

3.5. Micronaut JIT Benchmark

Summary:
  Total:        44.7587 secs
  Slowest:      0.0101 secs
  Fastest:      0.0005 secs
  Average:      0.0014 secs
  Requests/sec: 5585.5066

  Total data:   46000000 bytes
  Size/request: 184 bytes

Response time histogram:
  0.001 [1]     |
  0.001 [154273]        |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  0.002 [93279] |■■■■■■■■■■■■■■■■■■■■■■■■
  0.003 [1778]  |
  0.004 [275]   |
  0.005 [156]   |
  0.006 [103]   |
  0.007 [48]    |
  0.008 [39]    |
  0.009 [33]    |
  0.010 [15]    |


Latency distribution:
  10% in 0.0011 secs
  25% in 0.0012 secs
  50% in 0.0014 secs
  75% in 0.0016 secs
  90% in 0.0018 secs
  95% in 0.0019 secs
  99% in 0.0024 secs

Details (average, fastest, slowest):
  DNS+dialup:   0.0000 secs, 0.0005 secs, 0.0101 secs
  DNS-lookup:   0.0000 secs, 0.0000 secs, 0.0005 secs
  req write:    0.0000 secs, 0.0000 secs, 0.0025 secs
  resp wait:    0.0014 secs, 0.0005 secs, 0.0101 secs
  resp read:    0.0000 secs, 0.0000 secs, 0.0016 secs

Status code distribution:
  [200] 250000 responses
SpringBoot AOT Benchmark

3.6. Micronaut AOT Benchmark

Summary:
  Total:        48.0014 secs
  Slowest:      0.0126 secs
  Fastest:      0.0006 secs
  Average:      0.0015 secs
  Requests/sec: 5208.1784

  Total data:   46000000 bytes
  Size/request: 184 bytes

Response time histogram:
  0.001 [1]     |
  0.002 [207056]        |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  0.003 [38944] |■■■■■■■■
  0.004 [1949]  |
  0.005 [558]   |
  0.007 [1017]  |
  0.008 [314]   |
  0.009 [103]   |
  0.010 [41]    |
  0.011 [9]     |
  0.013 [8]     |


Latency distribution:
  10% in 0.0011 secs
  25% in 0.0013 secs
  50% in 0.0014 secs
  75% in 0.0017 secs
  90% in 0.0019 secs
  95% in 0.0022 secs
  99% in 0.0035 secs

Details (average, fastest, slowest):
  DNS+dialup:   0.0000 secs, 0.0006 secs, 0.0126 secs
  DNS-lookup:   0.0000 secs, 0.0000 secs, 0.0004 secs
  req write:    0.0000 secs, 0.0000 secs, 0.0014 secs
  resp wait:    0.0015 secs, 0.0005 secs, 0.0126 secs
  resp read:    0.0000 secs, 0.0000 secs, 0.0013 secs

Status code distribution:
  [200] 250000 responses
SpringBoot AOT Benchmark

3.7. Comparison

This benchmark is far from complete. With different scenarios and/or optimizations the result could be different.

This said, resource consumption and performance seems similar across the JIT runs and the AOT runs for all three Frameworks.

Quarkus seems to have a slight advantage regarding both latency and memory footprint.

this is a specific scenario and there is no resource cap.
Latency % SpringBoot JIT SpringBoot AOT Quarkus JIT Quarkus AOT Micronaut JIT Micronaut AOT

10%

0.0011s

0.0011s

0.0010s

0.0011s

0.0011s

0.0011s

25%

0.0012s

0.0013s

0.0012s

0.0012s

0.0012s

0.0013s

50%

0.0014s

0.0015s

0.0013s

0.0014s

0.0014s

0.0014s

75%

0.0016s

0.0017s

0.0015s

0.0016s

0.0016s

0.0017s

90%

0.0018s

0.0020s

0.0017s

0.0018s

0.0018s

0.0019s

95%

0.0019s

0.0023s

0.0018s

0.0020s

0.0019s

0.0022s

99%

0.0023s

0.0033s

0.0023s

0.0031s

0.0024s

0.0035s

Latency Distribution Graph
Latency Distribution Comparison (Framework Comparison)

4. Benchmark (with resource limit)

This is a simple comparison benchmark between the same scenario for SpringBoot, Quarkus and Micronaut, both in JIT and AOT (GraalVM) version.

The specs of the system used for the runs are

  • AMD Ryzen 7 3700X 8 Core / 16 Threads

  • 32 GB Memory

  • Ubuntu 24 OS

  • NVME disk

  • MongoDB 8.2.3 running as container and already initialized

  • Docker 27.2

The benchmark tool used is hey.

Each run is composed of 250.000 request (two times, first for warm up, second for benchmark), with 8 connections.

Resource cap has been set on docker containers :

  • mongo db - 2CPU, 2GB

  • JIT microservice - 1CPU, 500M

  • APT microservice - 1CPU, 200M

4.1. SpringBoot JIT Benchmark (container, with resource limit)

  • Docker image : fugeritorg/springboot-photobook:v2.3.1

  • Startup time : about 4000 ms

  • CPU : 1

  • Memory : 500M

Summary:
  Total:        55.3979 secs
  Slowest:      0.0712 secs
  Fastest:      0.0005 secs
  Average:      0.0018 secs
  Requests/sec: 4512.8037


Response time histogram:
  0.000 [1]     |
  0.008 [245561]        |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  0.015 [15]    |
  0.022 [0]     |
  0.029 [8]     |
  0.036 [8]     |
  0.043 [28]    |
  0.050 [1602]  |
  0.057 [2559]  |
  0.064 [128]   |
  0.071 [90]    |


Latency distribution:
  10% in 0.0007 secs
  25% in 0.0007 secs
  50% in 0.0008 secs
  75% in 0.0010 secs
  90% in 0.0012 secs
  95% in 0.0014 secs
  99% in 0.0503 secs

Details (average, fastest, slowest):
  DNS+dialup:   0.0000 secs, 0.0005 secs, 0.0712 secs
  DNS-lookup:   0.0000 secs, 0.0000 secs, 0.0018 secs
  req write:    0.0000 secs, 0.0000 secs, 0.0040 secs
  resp wait:    0.0017 secs, 0.0004 secs, 0.0712 secs
  resp read:    0.0000 secs, 0.0000 secs, 0.0540 secs

Status code distribution:
  [200] 250000 responses

4.2. SpringBoot AOT Benchmark (container, with resource limit)

  • Docker image : fugeritorg/springboot-photobook:v2.3.1-native

  • Startup time : about 25 ms

  • CPU : 1

  • Memory : 200M

Summary:
  Total:        66.9154 secs
  Slowest:      0.0217 secs
  Fastest:      0.0006 secs
  Average:      0.0021 secs
  Requests/sec: 3736.0611


Response time histogram:
  0.001 [1]     |
  0.003 [230885]        |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  0.005 [12483] |■■
  0.007 [197]   |
  0.009 [1361]  |
  0.011 [1869]  |
  0.013 [2189]  |
  0.015 [750]   |
  0.017 [163]   |
  0.020 [61]    |
  0.022 [41]    |


Latency distribution:
  10% in 0.0017 secs
  25% in 0.0017 secs
  50% in 0.0018 secs
  75% in 0.0020 secs
  90% in 0.0023 secs
  95% in 0.0029 secs
  99% in 0.0116 secs

Details (average, fastest, slowest):
  DNS+dialup:   0.0000 secs, 0.0006 secs, 0.0217 secs
  DNS-lookup:   0.0000 secs, 0.0000 secs, 0.0015 secs
  req write:    0.0000 secs, 0.0000 secs, 0.0018 secs
  resp wait:    0.0021 secs, 0.0005 secs, 0.0216 secs
  resp read:    0.0000 secs, 0.0000 secs, 0.0146 secs

Status code distribution:
  [200] 250000 responses

4.3. Quarkus JIT Benchmark (container, with resource limit)

  • Docker image : fugeritorg/quarkus-photobook:v1.1.2

  • Startup time : about 2000 ms

  • CPU : 1

  • Memory : 500M

Summary:
  Total:        46.0769 secs
  Slowest:      0.0729 secs
  Fastest:      0.0004 secs
  Average:      0.0015 secs
  Requests/sec: 5425.7127

  Total data:   46000000 bytes
  Size/request: 184 bytes

Response time histogram:
  0.000 [1]     |
  0.008 [246313]        |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  0.015 [0]     |
  0.022 [0]     |
  0.029 [8]     |
  0.037 [8]     |
  0.044 [213]   |
  0.051 [3088]  |■
  0.058 [113]   |
  0.066 [29]    |
  0.073 [227]   |


Latency distribution:
  10% in 0.0006 secs
  25% in 0.0006 secs
  50% in 0.0007 secs
  75% in 0.0008 secs
  90% in 0.0011 secs
  95% in 0.0013 secs
  99% in 0.0461 secs

Details (average, fastest, slowest):
  DNS+dialup:   0.0000 secs, 0.0004 secs, 0.0729 secs
  DNS-lookup:   0.0000 secs, 0.0000 secs, 0.0005 secs
  req write:    0.0000 secs, 0.0000 secs, 0.0007 secs
  resp wait:    0.0014 secs, 0.0004 secs, 0.0729 secs
  resp read:    0.0000 secs, 0.0000 secs, 0.0007 secs

Status code distribution:
  [200] 250000 responses

4.4. Quarkus AOT Benchmark (container, with resource limit)

  • Docker image : fugeritorg/quarkus-photobook:v1.1.2-native

  • Startup time : about 20 ms

  • CPU : 1

  • Memory : 200M

Summary:
  Total:        61.7660 secs
  Slowest:      0.0496 secs
  Fastest:      0.0005 secs
  Average:      0.0020 secs
  Requests/sec: 4047.5363

  Total data:   46000000 bytes
  Size/request: 184 bytes

Response time histogram:
  0.001 [1]     |
  0.005 [244902]        |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  0.010 [153]   |
  0.015 [8]     |
  0.020 [0]     |
  0.025 [0]     |
  0.030 [0]     |
  0.035 [52]    |
  0.040 [1589]  |
  0.045 [3012]  |
  0.050 [283]   |


Latency distribution:
  10% in 0.0009 secs
  25% in 0.0010 secs
  50% in 0.0011 secs
  75% in 0.0013 secs
  90% in 0.0016 secs
  95% in 0.0021 secs
  99% in 0.0408 secs

Details (average, fastest, slowest):
  DNS+dialup:   0.0000 secs, 0.0005 secs, 0.0496 secs
  DNS-lookup:   0.0000 secs, 0.0000 secs, 0.0004 secs
  req write:    0.0000 secs, 0.0000 secs, 0.0005 secs
  resp wait:    0.0019 secs, 0.0005 secs, 0.0496 secs
  resp read:    0.0000 secs, 0.0000 secs, 0.0008 secs

Status code distribution:
  [200] 250000 responses

4.5. Micronaut JIT Benchmark (container, with resource limit)

  • Docker image : fugeritorg/micronaut-photobook:v1.1.1

  • Startup time : about 2000 ms

  • CPU : 1

  • Memory : 500M

Summary:
  Total:        40.3541 secs
  Slowest:      0.0635 secs
  Fastest:      0.0004 secs
  Average:      0.0013 secs
  Requests/sec: 6195.1607

  Total data:   46000000 bytes
  Size/request: 184 bytes

Response time histogram:
  0.000 [1]     |
  0.007 [246764]        |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  0.013 [5]     |
  0.019 [8]     |
  0.026 [0]     |
  0.032 [9]     |
  0.038 [153]   |
  0.045 [2503]  |
  0.051 [501]   |
  0.057 [40]    |
  0.064 [16]    |


Latency distribution:
  10% in 0.0006 secs
  25% in 0.0006 secs
  50% in 0.0007 secs
  75% in 0.0008 secs
  90% in 0.0010 secs
  95% in 0.0011 secs
  99% in 0.0409 secs

Details (average, fastest, slowest):
  DNS+dialup:   0.0000 secs, 0.0004 secs, 0.0635 secs
  DNS-lookup:   0.0000 secs, 0.0000 secs, 0.0005 secs
  req write:    0.0000 secs, 0.0000 secs, 0.0007 secs
  resp wait:    0.0013 secs, 0.0004 secs, 0.0635 secs
  resp read:    0.0000 secs, 0.0000 secs, 0.0031 secs

Status code distribution:
  [200] 250000 responses

4.6. Micronaut AOT Benchmark (container, with resource limit)

  • Docker image : fugeritorg/micronaut-photobook:v1.1.1-native

  • Startup time : about 15 ms

  • CPU : 1

  • Memory : 200M

Summary:
  Total:        49.1055 secs
  Slowest:      0.0460 secs
  Fastest:      0.0005 secs
  Average:      0.0016 secs
  Requests/sec: 5091.0743

  Total data:   46000000 bytes
  Size/request: 184 bytes

Response time histogram:
  0.001 [1]     |
  0.005 [245873]        |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  0.010 [214]   |
  0.014 [8]     |
  0.019 [0]     |
  0.023 [12]    |
  0.028 [12]    |
  0.032 [34]    |
  0.037 [1727]  |
  0.041 [1937]  |
  0.046 [182]   |


Latency distribution:
  10% in 0.0008 secs
  25% in 0.0008 secs
  50% in 0.0009 secs
  75% in 0.0011 secs
  90% in 0.0013 secs
  95% in 0.0018 secs
  99% in 0.0364 secs

Details (average, fastest, slowest):
  DNS+dialup:   0.0000 secs, 0.0005 secs, 0.0460 secs
  DNS-lookup:   0.0000 secs, 0.0000 secs, 0.0004 secs
  req write:    0.0000 secs, 0.0000 secs, 0.0007 secs
  resp wait:    0.0015 secs, 0.0005 secs, 0.0460 secs
  resp read:    0.0000 secs, 0.0000 secs, 0.0009 secs

Status code distribution:
  [200] 250000 responses

4.7. Comparison with resource limit

Latency % SpringBoot JIT SpringBoot AOT Quarkus JIT Quarkus AOT Micronaut JIT Micronaut AOT

10%

0.0007s

0.0017s

0.0006s

0.0009s

0.0006s

0.0008s

25%

0.0007s

0.0017s

0.0006s

0.0010s

0.0006s

0.0008s

50%

0.0008s

0.0018s

0.0007s

0.0011s

0.0007s

0.0009s

75%

0.0010s

0.0020s

0.0008s

0.0013s

0.0008s

0.0011s

90%

0.0012s

0.0023s

0.0011s

0.0016s

0.0010s

0.0013s

95%

0.0014s

0.0029s

0.0013s

0.0021s

0.0011s

0.0018s

99%

0.0503s

0.0116s

0.0461s

0.0408s

0.0409s

0.0364s

Latency Distribution Graph
Latency Distribution Comparison (Framework Comparison)