Selaa lähdekoodia

Merge pull request #34 from TechEmpower/master

a
三刀 1 vuosi sitten
vanhempi
commit
6116cb9772
100 muutettua tiedostoa jossa 2606 lisäystä ja 430 poistoa
  1. 12 13
      Dockerfile
  2. 7 7
      frameworks/C++/drogon/drogon-core.dockerfile
  3. 7 7
      frameworks/C++/drogon/drogon.dockerfile
  4. 2 2
      frameworks/C++/drogon/drogon_benchmark/controllers/FortuneCtrlRaw.cc
  5. 4 3
      frameworks/C++/drogon/drogon_benchmark/controllers/FortuneCtrlRaw.h
  6. 1 1
      frameworks/C++/drogon/drogon_benchmark/controllers/UpdatesCtrlRaw.cc
  7. 40 0
      frameworks/C++/paozhu/README.md
  8. 31 0
      frameworks/C++/paozhu/benchmark_config.json
  9. 22 0
      frameworks/C++/paozhu/config.toml
  10. 54 0
      frameworks/C++/paozhu/paozhu.dockerfile
  11. 508 0
      frameworks/C++/paozhu/paozhu_benchmark/CMakeLists.txt
  12. 51 0
      frameworks/C++/paozhu/paozhu_benchmark/common/autocontrolmethod.hpp
  13. 32 0
      frameworks/C++/paozhu/paozhu_benchmark/common/json_reflect_headers.h
  14. 16 0
      frameworks/C++/paozhu/paozhu_benchmark/common/reghttpmethod.hpp
  15. 20 0
      frameworks/C++/paozhu/paozhu_benchmark/common/reghttpmethod_pre.hpp
  16. 20 0
      frameworks/C++/paozhu/paozhu_benchmark/conf/orm.conf
  17. 42 0
      frameworks/C++/paozhu/paozhu_benchmark/conf/server.conf
  18. 19 0
      frameworks/C++/paozhu/paozhu_benchmark/controller/include/techempower.h
  19. 241 0
      frameworks/C++/paozhu/paozhu_benchmark/controller/src/techempower.cpp
  20. 15 0
      frameworks/C++/paozhu/paozhu_benchmark/libs/types/techempower_json.h
  21. 291 0
      frameworks/C++/paozhu/paozhu_benchmark/libs/types/techempower_json_jsonreflect.cpp
  22. 2 2
      frameworks/C++/userver/userver_configs/static_config.yaml
  23. 3 3
      frameworks/C/h2o/h2o.dockerfile
  24. 120 79
      frameworks/C/h2o/src/database.c
  25. 1 1
      frameworks/C/h2o/src/database.h
  26. 4 3
      frameworks/C/h2o/src/handlers/world.c
  27. 1 4
      frameworks/CSharp/appmpower/src/Data/DbConnection.cs
  28. 1 1
      frameworks/CSharp/appmpower/src/Data/DbConnections.cs
  29. 2 1
      frameworks/CSharp/appmpower/src/HttpApplication.cs
  30. 11 0
      frameworks/CSharp/appmpower/src/Kestrel/PlainText.cs
  31. 1 0
      frameworks/CSharp/appmpower/src/Program.cs
  32. 1 1
      frameworks/CSharp/appmpower/src/appMpower.csproj
  33. 1 0
      frameworks/CSharp/aspnetcore-mono/Benchmarks/Benchmarks.csproj
  34. 1 1
      frameworks/CSharp/aspnetcore-mono/PlatformBenchmarks/PlatformBenchmarks.csproj
  35. 1 1
      frameworks/CSharp/aspnetcore/src/Minimal/Minimal.csproj
  36. 1 1
      frameworks/CSharp/aspnetcore/src/Mvc/Mvc.csproj
  37. 1 1
      frameworks/CSharp/aspnetcore/src/Platform/Platform.csproj
  38. 5 5
      frameworks/CSharp/genhttp/Benchmarks/Benchmarks.csproj
  39. 1 1
      frameworks/CSharp/sisk/sisk/sisk.csproj
  40. 1 1
      frameworks/Crystal/crystal/crystal-radix.dockerfile
  41. 1 1
      frameworks/Crystal/crystal/crystal.dockerfile
  42. 1 1
      frameworks/Crystal/crystal/shard.yml
  43. 1 1
      frameworks/Crystal/lucky/lucky.dockerfile
  44. 28 20
      frameworks/Crystal/lucky/shard.lock
  45. 4 2
      frameworks/Crystal/lucky/shard.yml
  46. 0 1
      frameworks/Crystal/lucky/src/actions/mixins/add_required_headers.cr
  47. 3 3
      frameworks/Crystal/toro/shard.yml
  48. 1 1
      frameworks/Crystal/toro/toro.cr
  49. 1 1
      frameworks/Crystal/toro/toro.dockerfile
  50. 1 1
      frameworks/FSharp/falco/src/App/App.fsproj
  51. 1 1
      frameworks/FSharp/frank/src/App/App.fsproj
  52. 1 2
      frameworks/FSharp/giraffe/README.md
  53. 1 1
      frameworks/FSharp/giraffe/giraffe-newtonsoft.dockerfile
  54. 1 1
      frameworks/FSharp/giraffe/giraffe.dockerfile
  55. 19 19
      frameworks/FSharp/giraffe/src/App/App.fsproj
  56. 360 0
      frameworks/FSharp/oxpecker/.gitignore
  57. 27 0
      frameworks/FSharp/oxpecker/README.md
  58. 30 0
      frameworks/FSharp/oxpecker/benchmark_config.json
  59. 19 0
      frameworks/FSharp/oxpecker/config.toml
  60. 14 0
      frameworks/FSharp/oxpecker/oxpecker.dockerfile
  61. 19 0
      frameworks/FSharp/oxpecker/src/App/App.fsproj
  62. 228 0
      frameworks/FSharp/oxpecker/src/App/Program.fs
  63. 3 3
      frameworks/FSharp/zebra/src/App/App.fsproj
  64. 1 1
      frameworks/FSharp/zebra/zebra-simple.dockerfile
  65. 1 1
      frameworks/FSharp/zebra/zebra.dockerfile
  66. 3 3
      frameworks/Go/aah/src/benchmark/go.mod
  67. 6 6
      frameworks/Go/aah/src/benchmark/go.sum
  68. 3 3
      frameworks/Go/echo/src/go.mod
  69. 6 6
      frameworks/Go/echo/src/go.sum
  70. 3 3
      frameworks/Go/gin/gin-gorm/go.mod
  71. 6 6
      frameworks/Go/gin/gin-gorm/go.sum
  72. 3 3
      frameworks/Go/gin/gin-src/go.mod
  73. 6 6
      frameworks/Go/gin/gin-src/go.sum
  74. 3 3
      frameworks/Go/gin/gin-std/go.mod
  75. 6 6
      frameworks/Go/gin/gin-std/go.sum
  76. 3 3
      frameworks/Go/goframe/src/go.mod
  77. 6 6
      frameworks/Go/goframe/src/go.sum
  78. 1 1
      frameworks/Go/kami/src/go.mod
  79. 2 2
      frameworks/Go/kami/src/go.sum
  80. 2 2
      frameworks/Go/ronykit/src/go.mod
  81. 5 5
      frameworks/Go/ronykit/src/go.sum
  82. 3 4
      frameworks/Java/helidon/helidon-nima.dockerfile
  83. 9 10
      frameworks/Java/helidon/nima/pom.xml
  84. 19 17
      frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/Main.java
  85. 23 18
      frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/PgClientRepository.java
  86. 4 4
      frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/services/DbService.java
  87. 3 3
      frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/services/FortuneHandler.java
  88. 12 18
      frameworks/Java/helidon/nima/src/main/resources/application.yaml
  89. 3 2
      frameworks/Java/inverno/inverno-postgres.dockerfile
  90. 17 25
      frameworks/Java/inverno/pom.xml
  91. 15 15
      frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/internal/Controller.java
  92. 3 1
      frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/internal/SqlClientReactorScope.java
  93. 3 1
      frameworks/Java/inverno/src/main/resources/configuration.cprops
  94. 32 5
      frameworks/Java/jooby/pom.xml
  95. 1 1
      frameworks/Java/jooby/src/main/java/com/techempower/App.java
  96. 4 8
      frameworks/Java/jooby/src/main/java/com/techempower/Json.java
  97. 4 7
      frameworks/Java/jooby/src/main/java/com/techempower/ReactivePg.java
  98. 1 1
      frameworks/Java/light-java/pom.xml
  99. 24 24
      frameworks/Java/micronaut/benchmark_config.json
  100. 2 2
      frameworks/Java/micronaut/buildSrc/build.gradle

+ 12 - 13
Dockerfile

@@ -1,4 +1,4 @@
-FROM ubuntu:22.04
+FROM ubuntu:24.04
 
 ARG DEBIAN_FRONTEND=noninteractive
 # WARNING: DON'T PUT A SPACE AFTER ANY BACKSLASH OR APT WILL BREAK
@@ -20,22 +20,21 @@ RUN apt-get -yqq update && \
       python3 \
       python3-dev \
       python3-pip \
+      python3-psutil \
+      python3-psycopg2 \
+      python3-requests \
       siege \
-      software-properties-common
-
-RUN pip3 install \
+      software-properties-common && \
+    # Ubuntu's equivalent packages are too old and/or broken.
+    pip3 install \
+      --break-system-packages \
       colorama==0.3.1 \
-      docker==4.0.2 \
-      mysqlclient \
-      psutil \
-      psycopg2-binary \
-      pymongo==3.13.0 \
-      # urllib3 incompatibility:
-      # https://github.com/docker/docker-py/issues/3113#issuecomment-1525500104
-      requests==2.28.1
+      docker==7.0.0 \
+      mysqlclient==2.2.4 \
+      pymongo==4.7.2
 
 # Collect resource usage statistics
-ARG DOOL_VERSION=v1.2.0
+ARG DOOL_VERSION=v1.3.1
 
 WORKDIR /tmp
 RUN curl -LSs "https://github.com/scottchiefbaker/dool/archive/${DOOL_VERSION}.tar.gz" | \

+ 7 - 7
frameworks/C++/drogon/drogon-core.dockerfile

@@ -1,4 +1,4 @@
-FROM ubuntu:20.04
+FROM ubuntu:22.04
 
 COPY ./ ./
 
@@ -11,7 +11,7 @@ RUN  apt-get update -yqq && \
      zlib1g-dev && \
      add-apt-repository ppa:ubuntu-toolchain-r/test -y && \
 	 apt-get update -yqq && \
-	 apt-get install -yqq gcc-10 g++-10
+	 apt-get install -yqq gcc g++
 
 RUN locale-gen en_US.UTF-8
 
@@ -19,10 +19,10 @@ ENV LANG en_US.UTF-8
 ENV LANGUAGE en_US:en
 ENV LC_ALL en_US.UTF-8
 
-ENV CC=gcc-10
-ENV CXX=g++-10
-ENV AR=gcc-ar-10
-ENV RANLIB=gcc-ranlib-10
+ENV CC=gcc
+ENV CXX=g++
+ENV AR=gcc-ar
+ENV RANLIB=gcc-ranlib
 
 ENV IROOT=/install
 ENV DROGON_ROOT=$IROOT/drogon
@@ -41,7 +41,7 @@ RUN git clone https://github.com/an-tao/drogon
 
 WORKDIR $DROGON_ROOT
 
-RUN git checkout ebf87d69d7bb45dfa478ba364ef9374d9be25092
+RUN git checkout 96919df488e0ebaa0ed304bbd76bba33508df3cc 
 RUN git submodule update --init
 RUN mkdir build
 

+ 7 - 7
frameworks/C++/drogon/drogon.dockerfile

@@ -1,4 +1,4 @@
-FROM ubuntu:20.04
+FROM ubuntu:22.04
 
 COPY ./ ./
 
@@ -11,7 +11,7 @@ RUN  apt-get update -yqq && \
      zlib1g-dev && \
      add-apt-repository ppa:ubuntu-toolchain-r/test -y && \
 	 apt-get update -yqq && \
-	 apt-get install -yqq gcc-10 g++-10
+	 apt-get install -yqq gcc g++
 
 RUN locale-gen en_US.UTF-8
 
@@ -19,10 +19,10 @@ ENV LANG en_US.UTF-8
 ENV LANGUAGE en_US:en
 ENV LC_ALL en_US.UTF-8
 
-ENV CC=gcc-10
-ENV CXX=g++-10
-ENV AR=gcc-ar-10
-ENV RANLIB=gcc-ranlib-10
+ENV CC=gcc
+ENV CXX=g++
+ENV AR=gcc-ar
+ENV RANLIB=gcc-ranlib
 
 ENV IROOT=/install
 ENV DROGON_ROOT=$IROOT/drogon
@@ -41,7 +41,7 @@ RUN git clone https://github.com/an-tao/drogon
 
 WORKDIR $DROGON_ROOT
 
-RUN git checkout ebf87d69d7bb45dfa478ba364ef9374d9be25092
+RUN git checkout 96919df488e0ebaa0ed304bbd76bba33508df3cc 
 RUN git submodule update --init
 RUN mkdir build
 

+ 2 - 2
frameworks/C++/drogon/drogon_benchmark/controllers/FortuneCtrlRaw.cc

@@ -22,8 +22,8 @@ void FortuneCtrlRaw::asyncHandleHttpRequest(
         rows.reserve(r.size() + 1);
         for (auto const &row : r)
         {
-            rows.emplace_back(row[0ul].as<string_view>(),   // id
-                              row[1ul].as<string_view>());  // message
+            rows.emplace_back(row[0ul].as<std::string_view>(),   // id
+                              row[1ul].as<std::string_view>());  // message
         }
         rows.emplace_back("0", "Additional fortune added at request time.");
         std::sort(rows.begin(),

+ 4 - 3
frameworks/C++/drogon/drogon_benchmark/controllers/FortuneCtrlRaw.h

@@ -1,17 +1,18 @@
 #pragma once
 #include <drogon/HttpSimpleController.h>
 #include <drogon/IOThreadStorage.h>
+#include <string_view>
 
 using namespace drogon;
 struct Fortune
 {
-    Fortune(string_view &&id, string_view &&message)
+    Fortune(std::string_view &&id, std::string_view &&message)
         : id_(std::move(id)), message_(std::move(message))
     {
     }
     Fortune() = default;
-    string_view id_;
-    string_view message_;
+    std::string_view id_;
+    std::string_view message_;
 };
 class FortuneCtrlRaw : public drogon::HttpSimpleController<FortuneCtrlRaw>
 {

+ 1 - 1
frameworks/C++/drogon/drogon_benchmark/controllers/UpdatesCtrlRaw.cc

@@ -43,7 +43,7 @@ void UpdatesCtrlRaw::update(
     const DbClientPtr &client)
 {
     auto const &sql = getSQL(results->size());
-    auto sqlBinder = *client << string_view(sql.data(), sql.length());
+    auto sqlBinder = *client << std::string_view(sql.data(), sql.length());
     Json::Value json;
     json.resize(0);
     for (auto const &w : *results)

+ 40 - 0
frameworks/C++/paozhu/README.md

@@ -0,0 +1,40 @@
+# paozhu Benchmarking Test
+
+This is the [Paozhu](https://github.com/hggq/paozhu) 
+
+This Benchmarking Test code from https://github.com/hggq/paozhu/releases/tag/v1.5.8
+
+### Test Type Implementation Source Code
+
+* [Benchmark code](controller/src/techempower.cpp)
+* [ORM config](conf/orm.conf) 
+* [Server config](conf/server.conf) 
+
+## Test URLs
+### JSON
+
+http://localhost:8888/json
+
+### PLAINTEXT
+
+http://localhost:8888/plaintext
+
+
+### Single Database Query
+
+http://localhost:8888/db
+
+### Fortune
+
+http://localhost:8888/fortunes
+
+### Multiple Database Queries
+
+http://localhost:8888/queries?queries=10
+
+### Database Updates
+
+http://localhost:8888/updates?queries=10
+
+### Cache
+http://localhost:8888/cached-queries?count=20

+ 31 - 0
frameworks/C++/paozhu/benchmark_config.json

@@ -0,0 +1,31 @@
+{
+  "framework": "paozhu",
+  "tests": [
+    {
+      "default": {
+        "json_url": "/json",
+        "plaintext_url": "/plaintext",
+        "db_url": "/db",
+        "fortune_url": "/fortunes",
+        "query_url": "/queries?queries=",
+        "update_url": "/updates?queries=",
+        "cached_query_url": "/cached-queries?count=",
+        "port": 8888,
+        "approach": "Realistic",
+        "classification": "Fullstack",
+        "database": "MySQL",
+        "framework": "paozhu",
+        "language": "C++",
+        "flavor": "None",
+        "orm": "Micro",
+        "platform": "None",
+        "webserver": "None",
+        "os": "Linux",
+        "database_os": "Linux",
+        "display_name": "paozhu",
+        "notes": "",
+        "versus": "None"
+      }
+    }
+  ]
+}

+ 22 - 0
frameworks/C++/paozhu/config.toml

@@ -0,0 +1,22 @@
+[framework]
+name = "paozhu"
+authors = ["Huang ziquan <[email protected]>"]
+github = "https://github.com/hggq/paozhu"
+
+[main]
+urls.plaintext = "/plaintext"
+urls.json = "/json"
+urls.db = "/db"
+urls.query = "/queries?queries="
+urls.update = "/updates?queries="
+urls.fortune = "/fortunes"
+urls.cached_query = "/cached-queries?count="
+approach = "Realistic"
+classification = "Fullstack"
+database = "MySQL"
+database_os = "Linux"
+os = "Linux"
+orm = "Micro"
+platform = "None"
+webserver = "None"
+versus = "None"

+ 54 - 0
frameworks/C++/paozhu/paozhu.dockerfile

@@ -0,0 +1,54 @@
+FROM ubuntu:22.04
+RUN apt-get update -yqq && apt-get install -yqq apt-utils software-properties-common wget unzip cmake git
+RUN apt-get install -yqq gcc g++ openssl libssl-dev zlib1g-dev build-essential locales
+
+RUN apt-get -y install brotli libbrotli-dev 
+RUN apt-get -y install libreadline-dev 
+RUN apt-get -y install mysql-client
+RUN apt-get -y install libmysqlclient-dev
+
+RUN locale-gen en_US.UTF-8
+ENV LANG en_US.UTF-8
+ENV LANGUAGE en_US:en
+ENV LC_ALL en_US.UTF-8
+
+COPY ./ ./
+WORKDIR /
+
+# RUN wget https://github.com/hggq/paozhu/releases/download/v1.5.8/benchmark.zip
+RUN git clone https://github.com/hggq/paozhu
+# RUN unzip benchmark.zip
+RUN rm -Rf ./paozhu/controller
+RUN rm -Rf ./paozhu/libs
+RUN mkdir ./paozhu/libs
+RUN mkdir ./paozhu/libs/types
+
+RUN mkdir ./paozhu/controller
+RUN mkdir ./paozhu/controller/include
+RUN mkdir ./paozhu/controller/src
+
+COPY ./paozhu_benchmark/controller/include/techempower.h ./paozhu/controller/include/
+COPY ./paozhu_benchmark/controller/src/techempower.cpp ./paozhu/controller/src/
+
+COPY ./paozhu_benchmark/libs/types/techempower_json.h ./paozhu/libs/types/
+COPY ./paozhu_benchmark/libs/types/techempower_json_jsonreflect.cpp ./paozhu/libs/types/
+
+COPY ./paozhu_benchmark/common/autocontrolmethod.hpp ./paozhu/common/
+COPY ./paozhu_benchmark/common/reghttpmethod_pre.hpp ./paozhu/common/
+COPY ./paozhu_benchmark/common/reghttpmethod.hpp ./paozhu/common/
+COPY ./paozhu_benchmark/common/json_reflect_headers.h ./paozhu/common/
+
+COPY ./paozhu_benchmark/conf/server.conf ./paozhu/conf/server.conf
+COPY ./paozhu_benchmark/conf/orm.conf ./paozhu/conf/orm.conf
+COPY ./paozhu_benchmark/CMakeLists.txt ./paozhu/CMakeLists.txt
+
+WORKDIR /paozhu
+RUN unzip asio.zip
+
+RUN cmake . -B build -DCMAKE_BUILD_TYPE=Release 
+RUN cmake --build build
+
+
+EXPOSE 8888
+
+CMD ./bin/paozhu 

+ 508 - 0
frameworks/C++/paozhu/paozhu_benchmark/CMakeLists.txt

@@ -0,0 +1,508 @@
+CMAKE_MINIMUM_REQUIRED(VERSION 3.20)
+
+cmake_policy(SET CMP0048 NEW)
+
+set(ENABLE_VCPKG OFF CACHE BOOL "choose ON to enable")
+set(ENABLE_BOOST OFF CACHE BOOL "choose ON to enable")
+set(ENABLE_GD OFF CACHE BOOL "choose ON to enable")
+set(ENABLE_WIN_VCPKG OFF CACHE BOOL "choose ON to enable")
+
+if (ENABLE_GD STREQUAL "ON")
+    list(FIND VCPKG_MANIFEST_FEATURES "gd" index)
+    if (index EQUAL -1)
+        message(STATUS "Auto append features: gd")
+        list(APPEND VCPKG_MANIFEST_FEATURES "gd")
+    endif ()
+endif ()
+
+if (ENABLE_BOOST STREQUAL "ON")
+    list(FIND VCPKG_MANIFEST_FEATURES "boost" index)
+    if (index EQUAL -1)
+        message(STATUS "Auto append features: boost")
+        list(APPEND VCPKG_MANIFEST_FEATURES "boost")
+    endif ()
+endif ()
+
+PROJECT(Paozhu_web_framework)
+set(CMAKE_CXX_STANDARD 20)
+set(CMAKE_CXX_STANDARD_REQUIRED ON)
+
+set(mode "CMAKE_BUILD_TYPE")
+
+set(BOOST_OPEN "  ")
+set(GD_OPEN " ")
+
+if(ENABLE_BOOST STREQUAL "ON")
+  message("ENABLE_BOOST")
+  set(BOOST_OPEN " -DENABLE_BOOST ")
+endif()
+
+if(ENABLE_GD STREQUAL "ON")
+    message("ENABLE_GD")
+    set(GD_OPEN " -DENABLE_GD ")
+endif()
+
+set(sys_so_path "/usr/lib64")
+
+if (IS_DIRECTORY "/usr/lib/x86_64-linux-gnu")
+  set(sys_so_path "/usr/lib/x86_64-linux-gnu")
+endif()
+
+if (CMAKE_SYSTEM_NAME MATCHES "Windows")
+  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_WIN32_WINNT=0x0601")
+endif()
+
+if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
+    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /utf-8 /EHsc")
+endif ()
+
+if(${mode} AND (CMAKE_BUILD_TYPE STREQUAL "Debug"))
+
+    if(CMAKE_SYSTEM_NAME MATCHES "Windows")
+        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DASIO_STANDALONE -DDEBUG ${BOOST_OPEN} ${GD_OPEN}")
+        if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
+            set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /fsanitize=address")
+        elseif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
+            set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -pthread -g")
+        endif ()
+    else()
+        set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall -Wextra")
+        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -pthread -g -fsanitize=address -DASIO_STANDALONE -DDEBUG ${BOOST_OPEN} ${GD_OPEN} -I/usr/local/include -I/usr/local/mysql/include   -I/usr/include -I/usr/include/mysql " )
+    endif ()
+    message("Debug mode:${CMAKE_CXX_FLAGS_DEBUG}")
+
+elseif(${mode} AND (CMAKE_BUILD_TYPE STREQUAL "Release"))
+
+    if (CMAKE_SYSTEM_NAME MATCHES "Windows")
+        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DASIO_STANDALONE ${BOOST_OPEN} ${GD_OPEN} -O3")
+        if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
+            set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -pthread")
+        endif ()
+    else ()
+        set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Wall -Wextra -O3")
+        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread  -DASIO_STANDALONE ${BOOST_OPEN} ${GD_OPEN}  -I/usr/local/include -I/usr/local/mysql/include -I/usr/include -I/usr/include/mysql  " )
+        file(MAKE_DIRECTORY /usr/local/etc/paozhu)
+        file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/conf/ DESTINATION /usr/local/etc/paozhu/)
+    endif ()
+    message("Release mode:${CMAKE_CXX_FLAGS_RELEASE}")
+
+else()
+    set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall -Wextra")
+    message("Debug mode:${CMAKE_CXX_FLAGS_DEBUG}")
+    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -pthread  -g -fsanitize=address  -DASIO_STANDALONE -DDEBUG ${BOOST_OPEN} ${GD_OPEN} -I/usr/local/include -I/usr/local/mysql/include   -I/usr/include  -I/usr/include/mysql  " )
+
+    if(NOT CMAKE_SYSTEM_NAME MATCHES "Windows")
+        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address")
+    endif ()
+endif()
+
+
+
+file(MAKE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/temp)
+file(MAKE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/log)
+set(EXECUTABLE_OUTPUT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/bin)
+set(USE_STANDALONE_ASIO ON)
+set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
+
+message(STATUS "SOURCE dir ${CMAKE_CURRENT_SOURCE_DIR}")
+
+
+set(CMAKE_BUILD_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/build)
+set(CMAKE_CACHEFILE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/build)
+set(CMAKE_CURRENT_BINARY_DIR ${CMAKE_CURRENT_SOURCE_DIR}/build)
+include_directories(${CMAKE_CURRENT_SOURCE_DIR}/common)
+include_directories(${CMAKE_CURRENT_SOURCE_DIR}/controller)
+include_directories(${CMAKE_CURRENT_SOURCE_DIR}/vendor/httpcli)
+include_directories(${CMAKE_CURRENT_SOURCE_DIR}/viewsrc/include)
+include_directories(${CMAKE_CURRENT_SOURCE_DIR}/websockets/include)
+include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
+
+if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/bin/paozhu_empty)
+  file(REMOVE_RECURSE ${CMAKE_CURRENT_SOURCE_DIR}/bin/paozhu_empty)
+endif ()
+#EXECUTE_PROCESS(COMMAND rm ${CMAKE_CURRENT_SOURCE_DIR}/bin/paozhu_empty)
+set(PAOZHU_PRE paozhu_pre)
+add_executable(${PAOZHU_PRE} ${CMAKE_CURRENT_SOURCE_DIR}/vendor/httpcli/autopickmethod.cpp ${CMAKE_CURRENT_SOURCE_DIR}/vendor/httpserver/src/md5.cpp)
+add_executable(paozhu_empty ${CMAKE_CURRENT_SOURCE_DIR}/vendor/httpcli/autoemptymethod.cpp)
+
+
+
+file(GLOB_RECURSE orm_list ${CMAKE_CURRENT_SOURCE_DIR}/orm/*.cpp)
+file(GLOB_RECURSE source_list ${CMAKE_CURRENT_SOURCE_DIR}/models/*.cpp)
+file(GLOB_RECURSE FRAMEWORK_CPP_PATH ${CMAKE_CURRENT_SOURCE_DIR}/vendor/httpserver/*.cpp)
+file(GLOB_RECURSE common_list ${CMAKE_CURRENT_SOURCE_DIR}/common/*.cpp)
+file(GLOB_RECURSE controller_list ${CMAKE_CURRENT_SOURCE_DIR}/controller/src/*.cpp)
+file(GLOB_RECURSE viewsrc_list ${CMAKE_CURRENT_SOURCE_DIR}/viewsrc/view/*.cpp)
+file(GLOB_RECURSE reflect_list ${CMAKE_CURRENT_SOURCE_DIR}/libs/*.cpp)
+file(GLOB_RECURSE src_list ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)
+
+foreach(cppfile IN LISTS controller_list)
+  string(REGEX REPLACE "${CMAKE_CURRENT_SOURCE_DIR}/controller/src/" "" cppfilename ${cppfile})
+  string(REGEX REPLACE ".cpp" "" cppbasename ${cppfilename})
+#  message(${cppbasename})
+  if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/controller/include/${cppbasename}.h")
+  else()
+      file(TOUCH "${CMAKE_CURRENT_SOURCE_DIR}/controller/include/${cppbasename}.h")
+  endif()
+endforeach()
+
+function(include_sub_directories_recursively root_dir)
+    if (IS_DIRECTORY ${root_dir})               # 当前路径是一个目录吗,是的话就加入到包含目录
+        #        if (${root_dir} MATCHES "include")
+        message("include dir: " ${root_dir})
+        include_directories(${root_dir})
+        #        endif()
+    endif()
+
+    file(GLOB ALL_SUB RELATIVE ${root_dir} ${root_dir}/*) # 获得当前目录下的所有文件,让如ALL_SUB列表中
+
+    foreach(sub ${ALL_SUB})
+        if (IS_DIRECTORY ${root_dir}/${sub})
+            include_sub_directories_recursively(${root_dir}/${sub}) # 对子目录递归调用,包含
+        endif()
+    endforeach()
+endfunction()
+
+include_sub_directories_recursively(${CMAKE_CURRENT_SOURCE_DIR}/vendor/httpserver)
+include_sub_directories_recursively(${CMAKE_CURRENT_SOURCE_DIR}/orm)
+include_sub_directories_recursively(${CMAKE_CURRENT_SOURCE_DIR}/models)
+include_sub_directories_recursively(${CMAKE_CURRENT_SOURCE_DIR}/controller/include)
+include_sub_directories_recursively(${CMAKE_CURRENT_SOURCE_DIR}/libs)
+include_sub_directories_recursively(${CMAKE_CURRENT_SOURCE_DIR}/include)
+
+add_executable(paozhu_cli ${CMAKE_CURRENT_SOURCE_DIR}/vendor/httpcli/http_cli.cpp)
+set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bin)
+
+
+if(${mode} AND (CMAKE_BUILD_TYPE STREQUAL "Release"))
+  add_executable(paozhu ${CMAKE_CURRENT_SOURCE_DIR}/test/testbenchmark.cpp ${common_list} ${viewsrc_list} ${FRAMEWORK_CPP_PATH} ${orm_list} ${reflect_list} ${src_list} ${source_list} ${controller_list})
+else()
+  add_executable(paozhu ${CMAKE_CURRENT_SOURCE_DIR}/test/test.cpp ${common_list} ${viewsrc_list} ${FRAMEWORK_CPP_PATH} ${orm_list} ${reflect_list} ${src_list} ${source_list} ${controller_list})
+endif()
+
+if (ENABLE_WIN_VCPKG STREQUAL "ON")
+else ()
+add_custom_command(
+    TARGET paozhu_empty paozhu
+    DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/bin/paozhu_pre
+    PRE_BUILD
+    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/
+    COMMAND echo "-- controls method --"
+    COMMAND ${PAOZHU_PRE} ${CMAKE_CURRENT_SOURCE_DIR}/
+    COMMAND ${CMAKE_COMMAND} -E remove ${CMAKE_CURRENT_SOURCE_DIR}/bin/paozhu_empty
+    )
+endif()
+
+if (ENABLE_VCPKG)
+    add_compile_definitions(ENABLE_VCPKG)
+    find_package(asio CONFIG REQUIRED)
+    target_link_libraries(paozhu asio::asio)
+
+    if (ENABLE_BOOST)
+        add_compile_definitions(ENABLE_BOOST)
+        set(Boost_NO_WARN_NEW_VERSIONS ON)
+        find_package(Boost REQUIRED COMPONENTS filesystem coroutine)
+        target_link_libraries(paozhu Boost::boost Boost::filesystem Boost::coroutine)
+    endif ()
+
+    find_package(OpenSSL REQUIRED)
+    target_link_libraries(paozhu OpenSSL::Crypto OpenSSL::SSL)
+
+    find_package(ZLIB REQUIRED)
+    target_link_libraries(paozhu ZLIB::ZLIB)
+
+    # find_package(libmysql REQUIRED)
+    find_package(unofficial-libmariadb CONFIG REQUIRED)
+    find_path(MYSQL_ROOT_DIR mysql)
+    # target_link_libraries(paozhu ${MYSQL_LIBRARIES})
+    # target_link_libraries(paozhu_cli ${MYSQL_LIBRARIES})
+    target_link_libraries(paozhu unofficial::libmariadb)
+    target_link_libraries(paozhu_cli unofficial::libmariadb)
+    target_include_directories(paozhu PUBLIC ${MYSQL_ROOT_DIR}/mysql)
+    target_include_directories(paozhu_cli PUBLIC ${MYSQL_ROOT_DIR}/mysql)
+
+    if (ENABLE_GD STREQUAL "ON")
+        find_package(PkgConfig)
+        pkg_check_modules(LIBGD REQUIRED IMPORTED_TARGET gdlib)
+        target_link_libraries(paozhu PkgConfig::LIBGD)
+
+        find_path(QRENCODE_INCLUDE_DIR NAMES qrencode.h)
+        find_library(QRENCODE_LIBRARY_RELEASE qrencode)
+        # find_library(QRENCODE_LIBRARY_DEBUG qrencoded)
+        # set(QRENCODE_LIBRARIES optimized ${QRENCODE_LIBRARY_RELEASE} debug ${QRENCODE_LIBRARY_DEBUG})
+        target_include_directories(paozhu PRIVATE ${QRENCODE_INCLUDE_DIR})
+        target_link_libraries(paozhu ${QRENCODE_LIBRARY_RELEASE})
+        # MESSAGE(STATUS ${QRENCODE_LIBRARY_RELEASE})
+
+        # warning: Fixed an issue where ports/libqrencode would not automatically
+        #          copy dll files to the bin directory
+        if (CMAKE_SYSTEM_NAME MATCHES "Windows")
+            set(PATH_TO_QRENCODE_DLL "")
+            if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
+                set(PATH_TO_QRENCODE_DLL "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/bin/qrencode.dll")
+            elseif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
+                set(PATH_TO_QRENCODE_DLL "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/lib/libqrencode.dll")
+            endif ()
+            message(STATUS "Selected libqrencode.dll: ${PATH_TO_QRENCODE_DLL}")
+
+            add_custom_command(
+                    TARGET paozhu POST_BUILD
+                    COMMAND ${CMAKE_COMMAND} -E copy_if_different
+                    ${PATH_TO_QRENCODE_DLL} ${CMAKE_CURRENT_SOURCE_DIR}/bin/
+            )
+        endif ()
+
+        find_package(PNG REQUIRED)
+        target_link_libraries(paozhu PNG::PNG)
+
+        find_package(Freetype REQUIRED)
+        target_link_libraries(paozhu Freetype::Freetype)
+    endif ()
+
+    find_package(unofficial-brotli CONFIG REQUIRED)
+    target_link_libraries(paozhu unofficial::brotli::brotlidec unofficial::brotli::brotlienc)
+else ()
+
+if(USE_STANDALONE_ASIO)
+if(CMAKE_SYSTEM_NAME MATCHES "Darwin")
+set(ASIO_PATH "/usr/local/opt/asio/include" "/usr/local/include")
+else()
+set(ASIO_PATH ${CMAKE_CURRENT_SOURCE_DIR}/asio "/usr/include")
+endif()
+
+    target_compile_definitions(paozhu INTERFACE ASIO_STANDALONE)
+    find_path(ASIO_PATH asio.hpp)
+    message(state " Standalone Asio found: " ${ASIO_PATH})
+    if(NOT ASIO_PATH)
+        message(FATAL_ERROR "Standalone Asio not found")
+    else()
+        target_include_directories(paozhu INTERFACE ${ASIO_PATH})
+    endif()
+
+    include_directories(${ASIO_PATH})
+
+endif()
+
+
+if(ENABLE_BOOST STREQUAL "ON")
+message("---ENABLE_BOOST-----")
+find_package(Boost REQUIRED
+             COMPONENTS system filesystem)
+if(Boost_FOUND)
+    add_compile_definitions(ENABLE_BOOST)
+    include_directories("${Boost_INCLUDE_DIRS}/boost")
+
+    MESSAGE( STATUS "Boost_INCLUDE_DIRS = ${Boost_INCLUDE_DIRS}")
+    MESSAGE( STATUS "Boost_LIBRARIES = ${Boost_LIBRARY_DIRS}")
+    MESSAGE( STATUS "Boost_LIB_VERSION = ${Boost_LIB_VERSION}")
+    link_directories(${Boost_LIBRARY_DIRS})
+    target_link_libraries (paozhu ${Boost_LIBRARIES})
+endif()
+
+endif()
+
+
+find_package(OpenSSL REQUIRED)
+
+if(OPENSSL_FOUND)
+
+  message(STATUS "OPENSSL_VERSION = ${OPENSSL_VERSION}")
+  message(STATUS "OPENSSL_SSL_LIBRARY = ${OPENSSL_SSL_LIBRARY}")
+  message(STATUS "OPENSSL_CRYPTO_LIBRARY = ${OPENSSL_CRYPTO_LIBRARY}")
+  message(STATUS "OPENSSL_INCLUDE_DIR = ${OPENSSL_INCLUDE_DIR}")
+  INCLUDE_DIRECTORIES("${OPENSSL_INCLUDE_DIR}")
+  target_link_libraries (paozhu ${OPENSSL_SSL_LIBRARY})
+  target_link_libraries (paozhu ${OPENSSL_CRYPTO_LIBRARY})
+endif()
+
+
+find_package(ZLIB REQUIRED)
+if(ZLIB_FOUND)
+  message(STATUS "Zlib Found! ${ZLIB_LIBRARIES}")
+  include_directories(${ZLIB_INCLUDE_DIR})
+  set(zlib_library ${ZLIB_LIBRARIES})
+  target_link_libraries(paozhu z)
+endif()
+
+find_path(MYSQL_ROOT_DIR mysql)
+MESSAGE( STATUS "MYSQL_ROOT_DIR = ${MYSQL_ROOT_DIR} ")
+find_package_handle_standard_args(mysql REQUIRED_VARS MYSQL_ROOT_DIR)
+
+FIND_PATH(MYSQL_INCLUDE_DIR mysql.h
+  /usr/local/include/mysql
+  /usr/include/mysql
+  /usr/local/mysql/include
+)
+SET(MYSQL_NAMES mysqlclient)
+FIND_LIBRARY(MYSQL_LIBRARY
+  NAMES ${MYSQL_NAMES}
+  PATHS /usr/lib /usr/local/lib /usr/local/mysql/lib
+  PATH_SUFFIXES mysql
+)
+
+IF (MYSQL_INCLUDE_DIR AND MYSQL_LIBRARY)
+  SET(MYSQL_FOUND TRUE)
+  SET( MYSQL_LIBRARIES ${MYSQL_LIBRARY} )
+ELSE (MYSQL_INCLUDE_DIR AND MYSQL_LIBRARY)
+  SET(MYSQL_FOUND FALSE)
+  SET( MYSQL_LIBRARIES )
+ENDIF (MYSQL_INCLUDE_DIR AND MYSQL_LIBRARY)
+
+IF (MYSQL_FOUND)
+  IF (NOT MYSQL_FIND_QUIETLY)
+    MESSAGE(STATUS "Found MySQL: ${MYSQL_LIBRARY}")
+  ENDIF (NOT MYSQL_FIND_QUIETLY)
+ELSE (MYSQL_FOUND)
+  IF (MYSQL_FIND_REQUIRED)
+    MESSAGE(STATUS "Looked for MySQL libraries named ${MYSQL_NAMES}.")
+    MESSAGE(FATAL_ERROR "Could NOT find MySQL library")
+  ENDIF (MYSQL_FIND_REQUIRED)
+ENDIF (MYSQL_FOUND)
+
+target_include_directories(paozhu PUBLIC ${MYSQL_INCLUDE_DIR})
+target_link_libraries(paozhu ${MYSQL_LIBRARY})
+
+target_include_directories(paozhu_cli PUBLIC ${MYSQL_INCLUDE_DIR})
+target_link_libraries(paozhu_cli ${MYSQL_LIBRARY})
+
+
+
+if(ENABLE_GD STREQUAL "ON")
+message("---ENABLE_GD-----")
+
+if(CMAKE_SYSTEM_NAME MATCHES "Darwin")
+  set(GD_ROOT_DIR "/usr/local/opt/gd/lib")
+else()
+  set(GD_ROOT_DIR "${sys_so_path}")
+endif()
+
+set(find_gdname gd)
+
+find_library(GD_LIB_DIR
+  NAMES ${find_gdname}
+  PATHS "${GD_ROOT_DIR}"
+  NO_DEFAULT_PATH
+)
+
+if(NOT GD_LIB_DIR)
+message(FATAL_ERROR
+"GD Graphics Library NOT FOUND! please install . "
+)
+endif()
+
+message(STATUS "GD Graphics Library  at: ${GD_LIB_DIR}")
+
+if(CMAKE_SYSTEM_NAME MATCHES "Darwin")
+set(QR_ROOT_DIR "/usr/local/opt/qrencode/lib")
+else()
+set(QR_ROOT_DIR "${sys_so_path}")
+endif()
+
+set(find_qrname qrencode)
+
+find_library(QR_LIB_DIR
+  NAMES ${find_qrname}
+  PATHS "${QR_ROOT_DIR}"
+  NO_DEFAULT_PATH
+)
+
+if(NOT QR_LIB_DIR)
+message(FATAL_ERROR
+"qrencode Library  NOT FOUND! please install . "
+)
+endif()
+
+message(STATUS "qrencode at: ${QR_LIB_DIR}")
+
+INCLUDE_DIRECTORIES("${GD_ROOT_DIR}/include")
+INCLUDE_DIRECTORIES("${QR_ROOT_DIR}/include")
+link_directories("${QR_ROOT_DIR}/lib")
+link_directories("${GD_ROOT_DIR}/lib")
+target_link_libraries(paozhu ${GD_LIB_DIR})
+target_link_libraries(paozhu ${QR_LIB_DIR})
+
+if(CMAKE_SYSTEM_NAME MATCHES "Darwin")
+set(PNG_ROOT_DIR "/usr/local/opt/libpng/lib")
+else()
+set(PNG_ROOT_DIR "${sys_so_path}")
+endif()
+
+find_library(PNG_LIB_DIR
+  NAMES png
+  PATHS "${PNG_ROOT_DIR}"
+  NO_DEFAULT_PATH
+)
+target_link_libraries(paozhu ${PNG_LIB_DIR})
+
+if(CMAKE_SYSTEM_NAME MATCHES "Darwin")
+  set(FREETYPE_ROOT_DIR "/usr/local/opt/freetype/lib")
+else()
+  set(FREETYPE_ROOT_DIR "${sys_so_path}")
+endif()
+
+find_library(FREETYPE_LIB_DIR
+  NAMES freetype
+  PATHS "${FREETYPE_ROOT_DIR}"
+  NO_DEFAULT_PATH
+)
+target_link_libraries(paozhu ${FREETYPE_LIB_DIR})
+#end ENABLE_GD
+endif()
+
+if(CMAKE_SYSTEM_NAME MATCHES "Darwin")
+  set(BROTLI_ROOT_DIR "/usr/local/opt/brotli/lib")
+else()
+  set(BROTLI_ROOT_DIR "${sys_so_path}")
+endif()
+
+
+
+#find_package(Brotli COMPONENTS encoder decoder common REQUIRED)
+
+message(STATUS "Brotli at: ${BROTLI_ROOT_DIR}")
+
+set(find_brname brotlienc)
+set(find_brdename brotlidec)
+find_library(BR_LIB_DIR
+  NAMES ${find_brname}
+  PATHS "${BROTLI_ROOT_DIR}"
+  NO_DEFAULT_PATH
+)
+find_library(BRDEC_LIB_DIR
+  NAMES ${find_brdename}
+  PATHS "${BROTLI_ROOT_DIR}"
+  NO_DEFAULT_PATH
+)
+INCLUDE_DIRECTORIES("${BROTLI_ROOT_DIR}/include")
+link_directories("${BROTLI_ROOT_DIR}/lib")
+
+if(NOT BR_LIB_DIR)
+message(FATAL_ERROR
+"Brotli Library  NOT FOUND! please install . "
+)
+endif()
+
+message(STATUS "Brotli at: ${BR_LIB_DIR}")
+target_link_libraries(paozhu ${BR_LIB_DIR})
+
+
+if(NOT BRDEC_LIB_DIR)
+message(FATAL_ERROR
+"Brotli Library  NOT FOUND! please install . "
+)
+endif()
+
+message(STATUS "Brotli at: ${BRDEC_LIB_DIR}")
+target_link_libraries(paozhu ${BRDEC_LIB_DIR})
+
+
+message("Compile framework mode")
+
+target_link_libraries(paozhu  m  dl)
+
+endif ()
+
+if (CMAKE_SYSTEM_NAME MATCHES "Windows")
+   target_link_libraries(paozhu ws2_32)
+   target_link_libraries(paozhu_cli ws2_32)
+endif ()

+ 51 - 0
frameworks/C++/paozhu/paozhu_benchmark/common/autocontrolmethod.hpp

@@ -0,0 +1,51 @@
+
+#ifndef __HTTP_AUTO_REG_CONTROL_HTTPMETHOD_HPP
+#define __HTTP_AUTO_REG_CONTROL_HTTPMETHOD_HPP
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1200)
+#pragma once
+#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
+
+#include "httppeer.h" 
+
+#include "techempower.h"
+
+
+namespace http
+{
+  void _initauto_control_httpmethodregto(std::map<std::string, regmethold_t> &methodcallback)
+  {
+    struct regmethold_t temp;
+
+		temp.pre = nullptr;
+		temp.regfun = techempowerplaintext;
+		methodcallback.emplace("plaintext",temp);
+		temp.pre = nullptr;
+		temp.regfun = techempowerjson;
+		methodcallback.emplace("json",temp);
+		temp.pre = nullptr;
+		temp.regfun = techempowerdb;
+		methodcallback.emplace("db",temp);
+		temp.pre = nullptr;
+		temp.regfun = techempowerqueries;
+		methodcallback.emplace("queries",temp);
+		temp.pre = nullptr;
+		temp.regfun = techempowerfortunes;
+		methodcallback.emplace("fortunes",temp);
+		temp.pre = nullptr;
+		temp.regfun = techempowerupdates;
+		methodcallback.emplace("updates",temp);
+		temp.pre = nullptr;
+		temp.regfun = techempowercached_queries;
+		methodcallback.emplace("cached-queries",temp);
+		temp.pre = nullptr;
+		temp.regfun = techempowercached_db;
+		methodcallback.emplace("cached-db",temp);
+
+
+    }
+}
+
+#endif
+
+    

+ 32 - 0
frameworks/C++/paozhu/paozhu_benchmark/common/json_reflect_headers.h

@@ -0,0 +1,32 @@
+#pragma once
+#include <sstream>
+#include <string>
+#include <vector>
+#include <map>
+
+#include "types/techempower_json.h"
+#include "unicode.h"
+
+template <typename JSON_REF_OBJ_TEMP>
+std::string json_encode([[maybe_unused]] const JSON_REF_OBJ_TEMP &json_reflectobj) { return ""; }
+
+template <typename JSON_REF_OBJ_TEMP>
+std::string json_encode([[maybe_unused]] const std::vector<JSON_REF_OBJ_TEMP> &json_reflectobj) { return ""; }
+
+template <typename JSON_REF_OBJ_TEMP>
+unsigned int json_decode([[maybe_unused]] JSON_REF_OBJ_TEMP &json_reflectobj, [[maybe_unused]] const std::string &_json_data, [[maybe_unused]] unsigned int _offset) { return 0; }
+
+template <typename JSON_REF_OBJ_TEMP>
+unsigned int json_decode([[maybe_unused]] std::vector<JSON_REF_OBJ_TEMP> &json_reflectobj, [[maybe_unused]] const std::string &_json_data, [[maybe_unused]] unsigned int _offset) { return 0; }
+
+namespace http
+{
+
+std::string json_encode(const techempower_outjson_t &json_reflectobj);
+
+std::string json_encode(const std::vector<techempower_outjson_t> &json_reflectobj);
+
+unsigned int json_decode(techempower_outjson_t &json_reflectobj, const std::string &_json_data, unsigned int _offset = 0);
+
+unsigned int json_decode(std::vector<techempower_outjson_t> &json_reflectobj, const std::string &_json_data, unsigned int _offset = 0);
+}// namespace http

+ 16 - 0
frameworks/C++/paozhu/paozhu_benchmark/common/reghttpmethod.hpp

@@ -0,0 +1,16 @@
+#ifndef __HTTP_REGHTTPMETHOD_HPP
+#define __HTTP_REGHTTPMETHOD_HPP
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1200)
+#pragma once
+#endif// defined(_MSC_VER) && (_MSC_VER >= 1200)
+
+#include "httppeer.h"
+namespace http
+{
+void _inithttpmethodregto(std::map<std::string, regmethold_t> &methodcallback)
+{
+}
+
+}// namespace http
+#endif

+ 20 - 0
frameworks/C++/paozhu/paozhu_benchmark/common/reghttpmethod_pre.hpp

@@ -0,0 +1,20 @@
+#ifndef __HTTP_REGHTTPMETHOD_PRE_HPP
+#define __HTTP_REGHTTPMETHOD_PRE_HPP
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1200)
+#pragma once
+#endif// defined(_MSC_VER) && (_MSC_VER >= 1200)
+
+#include "httppeer.h"
+namespace http
+{
+void _inithttpmethodregto_pre(std::map<std::string, regmethold_t> &methodcallback)
+{
+    struct regmethold_t temp;
+    //temp.pre = adminlogin;
+    //temp.regfun = adminmar;
+    //methodcallback.emplace("adminmar", temp);
+}
+
+}// namespace http
+#endif

+ 20 - 0
frameworks/C++/paozhu/paozhu_benchmark/conf/orm.conf

@@ -0,0 +1,20 @@
+[default]
+type=main
+host=tfb-database
+port=3306
+dbname=hello_world
+user=benchmarkdbuser
+password=benchmarkdbpass
+pretable=
+maxpool=5
+dbtype=mysql
+
+type=second
+host=tfb-database
+port=3306
+dbname=hello_world
+user=benchmarkdbuser
+password=benchmarkdbpass
+pretable=
+maxpool=20
+dbtype=mysql

+ 42 - 0
frameworks/C++/paozhu/paozhu_benchmark/conf/server.conf

@@ -0,0 +1,42 @@
+[default]
+threadmax=1024
+threadmin=5
+httpport=8888
+httpsport=4430
+cothreadnum=8 ;Coroutines run on thread num
+
+http2_enable=0
+debug_enable=1
+deamon_enable=0
+mainhost=localhost
+certificate_chain_file=localhost.pem
+private_key_file=localhost.key
+tmp_dh_file=dh4096.pem
+reboot_password=e10adc3949ba59abbe56e057f20f883e ;md5(md5("123456")+"rand_char"+md5("123456"))
+session_type=1 ;session save type 0.file 1.memory 2.redis 3.memcache 4.reserve
+static_file_compress_cache=1 ;1 enable, Cache static file compress(gzip,br) content to cache directory 
+modelspath=/root/benchmark/models
+serverpath=/root/benchmark
+viewpath=/root/benchmark/view
+viewsopath=/root/benchmark/module/view
+
+controlpath=/root/benchmark/controller
+controlsopath=/root/benchmark/module/controller
+
+temppath=/root/benchmark/temp
+logpath=/root/benchmark/log
+wwwpath=/root/benchmark/www/default
+pluginspath=/root/benchmark/plugins
+libspath=/root/benchmark/libs
+directorylist=0
+index=index.html
+;usehtmlcache=1
+;usehtmlcachetime=3600
+rewrite_404=0   ;1 file 2 action url path
+rewrite_404_action=index.html
+method_pre=
+method_after=
+show_visitinfo=0
+upload_max_size=16777216
+
+

+ 19 - 0
frameworks/C++/paozhu/paozhu_benchmark/controller/include/techempower.h

@@ -0,0 +1,19 @@
+
+#pragma once
+#include <chrono>
+#include <thread>
+#include "httppeer.h"
+
+namespace http
+{
+
+            
+	std::string techempowerplaintext(std::shared_ptr<httppeer> peer);
+	std::string techempowerjson(std::shared_ptr<httppeer> peer);
+	std::string techempowerdb(std::shared_ptr<httppeer> peer);
+	std::string techempowerqueries(std::shared_ptr<httppeer> peer);
+	std::string techempowerfortunes(std::shared_ptr<httppeer> peer);
+	std::string techempowerupdates(std::shared_ptr<httppeer> peer);
+	std::string techempowercached_queries(std::shared_ptr<httppeer> peer);
+	std::string techempowercached_db(std::shared_ptr<httppeer> peer);
+}

+ 241 - 0
frameworks/C++/paozhu/paozhu_benchmark/controller/src/techempower.cpp

@@ -0,0 +1,241 @@
+#include "orm.h"
+#include <chrono>
+#include <thread>
+#include <algorithm>
+#include <random>
+#include <chrono>
+#include "httppeer.h"
+#include "techempower.h"
+#include "datetime.h"
+#include "func.h"
+#include "pzcache.h"
+#include "json_reflect_headers.h"
+#include "techempower_json.h"
+namespace http
+{
+    //@urlpath(null,plaintext)
+    std::string techempowerplaintext(std::shared_ptr<httppeer> peer)
+    {
+        peer->type("text/plain; charset=UTF-8");
+        peer->set_header("Date", get_gmttime());
+        peer->output = "Hello, World!";
+        return "";
+    }
+
+    //@urlpath(null,json)
+    std::string techempowerjson(std::shared_ptr<httppeer> peer)
+    {
+        peer->type("application/json; charset=UTF-8");
+        peer->set_header("Date", get_gmttime());
+        struct techempower_outjson_t a;
+        a.message = "Hello, World!";
+        peer->output = json_encode(a);
+        return "";
+    }
+
+    //@urlpath(null,db)
+    std::string techempowerdb(std::shared_ptr<httppeer> peer)
+    {
+        peer->type("application/json; charset=UTF-8");
+        peer->set_header("Date", get_gmttime());
+        auto myworld = orm::World();
+        unsigned int rd_num = rand_range(1, 10000);
+        myworld.get_one(rd_num);
+
+        peer->output = myworld.data_tojson();
+        return "";
+    }
+
+    //@urlpath(null,queries)
+    std::string techempowerqueries(std::shared_ptr<httppeer> peer)
+    {
+        peer->type("application/json; charset=UTF-8");
+        peer->set_header("Date", get_gmttime());
+
+        unsigned int get_num = peer->get["queries"].to_int();
+        if (get_num == 0)
+        {
+            get_num = 1;
+        }
+        else if (get_num > 500)
+        {
+            get_num = 500;
+        }
+        auto myworld = orm::World();
+        myworld.record.reserve(get_num);
+        for (unsigned int i = 0; i < get_num; i++)
+        {
+            myworld.wheresql.clear();
+            unsigned int rd_num = rand_range(1, 10000);
+            myworld.where("id", rd_num).fetch_append();
+        }
+
+        peer->output = myworld.to_json();
+        return "";
+    }
+
+    //@urlpath(null,fortunes)
+    std::string techempowerfortunes(std::shared_ptr<httppeer> peer)
+    {
+        peer->type("text/html; charset=UTF-8");
+        peer->set_header("Date", get_gmttime());
+
+        auto myfortune = orm::Fortune();
+        myfortune.fetch();
+        myfortune.data.id = 0;
+        myfortune.data.message = "Additional fortune added at request time.";
+        myfortune.record.push_back(myfortune.data);
+
+        std::sort(myfortune.record.begin(), myfortune.record.end(), [](const auto &lhs, const auto &rhs)
+                  { return lhs.message < rhs.message; });
+        peer->val["list"].set_array();
+        OBJ_ARRAY item;
+        for (unsigned int i = 0; i < myfortune.record.size(); i++)
+        {
+            item["id"] = myfortune.record[i].id;
+            item["message"] = html_encode(myfortune.record[i].message);
+            peer->val["list"].push(item);
+        }
+
+        peer->view("techempower/fortunes");
+        return "";
+    }
+
+    //@urlpath(null,updates)
+    std::string techempowerupdates(std::shared_ptr<httppeer> peer)
+    {
+        peer->type("application/json; charset=UTF-8");
+        peer->set_header("Date", get_gmttime());
+        unsigned int get_num = peer->get["queries"].to_int();
+
+        if (get_num == 0)
+        {
+            get_num = 1;
+        }
+        else if (get_num > 500)
+        {
+            get_num = 500;
+        }
+        auto myworld = orm::World();
+        myworld.record.clear();
+        myworld.record.reserve(get_num);
+        for (unsigned int i = 0; i < get_num; i++)
+        {
+            myworld.wheresql.clear();
+            myworld.where("id", rand_range(1, 10000)).fetch_append();
+            if (myworld.effect() > 0)
+            {
+                unsigned int j = myworld.record.size() - 1;
+                myworld.data.randomnumber = rand_range(1, 10000);
+                myworld.record[j].randomnumber = myworld.data.randomnumber;
+                myworld.update("randomnumber");
+            }
+        }
+        peer->output = myworld.to_json();
+        return "";
+    }
+
+    //@urlpath(null,cached-queries)
+    std::string techempowercached_queries(std::shared_ptr<httppeer> peer)
+    {
+        peer->type("application/json; charset=UTF-8");
+        peer->set_header("Date", get_gmttime());
+
+        unsigned int get_num = peer->get["count"].to_int();
+        if (get_num == 0)
+        {
+            get_num = 1;
+        }
+        else if (get_num > 500)
+        {
+            get_num = 500;
+        }
+        auto myworld = orm::World();
+        std::string mycacheid = "alldatacache";
+
+        pzcache<std::vector<orm::worldbase::meta>> &temp_cache = pzcache<std::vector<orm::worldbase::meta>>::conn();
+
+        std::vector<orm::worldbase::meta> allcachedata_array;
+        allcachedata_array.reserve(10000);
+        // create rand data to cache
+        if (temp_cache.check(mycacheid) > -1)
+        {
+            allcachedata_array = temp_cache.get(mycacheid);
+        }
+        else
+        {
+            allcachedata_array.resize(10000);
+            for (unsigned int i = 0; i < 10000; i++)
+            {
+                allcachedata_array[i].id = i + 1;
+                allcachedata_array[i].randomnumber = rand_range(1, 10000);
+            }
+            temp_cache.save(mycacheid, allcachedata_array, 120);
+        }
+        // get rand data from cache
+        mycacheid = "my" + std::to_string(get_num);
+        myworld.record.reserve(get_num);
+        if (temp_cache.check(mycacheid) > -1)
+        {
+            myworld.record = temp_cache.get(mycacheid);
+        }
+        else
+        {
+            if (allcachedata_array.size() == 10000)
+            {
+                for (unsigned int i = 0; i < get_num; i++)
+                {
+                    unsigned int temp_rid = rand_range(0, 9999);
+                    myworld.record.push_back(allcachedata_array[temp_rid]);
+                }
+            }
+            temp_cache.save(mycacheid, myworld.record, 120);
+        }
+
+        peer->output = myworld.to_json();
+        return "";
+    }
+
+    //@urlpath(null,cached-db)
+    std::string techempowercached_db(std::shared_ptr<httppeer> peer)
+    {
+        peer->type("application/json; charset=UTF-8");
+        peer->set_header("Date", get_gmttime());
+        // this test from database to cache
+        unsigned int get_num = peer->get["count"].to_int();
+        if (get_num == 0)
+        {
+            get_num = 1;
+        }
+        else if (get_num > 500)
+        {
+            get_num = 500;
+        }
+        auto myworld = orm::World();
+        std::string mycacheid = "my" + std::to_string(get_num);
+
+        pzcache<std::vector<orm::worldbase::meta>> &temp_cache = pzcache<std::vector<orm::worldbase::meta>>::conn();
+
+        myworld.record.reserve(get_num);
+        if (temp_cache.check(mycacheid) > -1)
+        {
+            myworld.record = temp_cache.get(mycacheid);
+        }
+        else
+        {
+            std::vector<unsigned int> cacheid;
+            for (unsigned int i = 0; i < get_num; i++)
+            {
+                cacheid.push_back(rand_range(1, 10000));
+            }
+
+            std::string sqlstr = array_to_sql(cacheid);
+            myworld.whereIn("id", sqlstr).fetch();
+            temp_cache.save(mycacheid, myworld.record, 120);
+        }
+
+        peer->output = myworld.to_json();
+        return "";
+    }
+
+} // namespace http

+ 15 - 0
frameworks/C++/paozhu/paozhu_benchmark/libs/types/techempower_json.h

@@ -0,0 +1,15 @@
+#ifndef LIBS_TYPES_TECHEMPOWER_TYPE_H
+#define LIBS_TYPES_TECHEMPOWER_TYPE_H
+#include <string>
+#include <sstream>
+
+namespace http
+{
+//@reflect json to_json from_json
+struct techempower_outjson_t
+{
+    std::string message;
+};
+
+}// namespace http
+#endif

+ 291 - 0
frameworks/C++/paozhu/paozhu_benchmark/libs/types/techempower_json_jsonreflect.cpp

@@ -0,0 +1,291 @@
+#include <sstream>
+#include <string>
+#include <vector>
+#include <map>
+#include "types/techempower_json.h"
+#include "json_reflect_headers.h"
+#include "unicode.h"
+#include "func.h"
+//This file is automatically created, do not edit it
+
+namespace http
+{
+
+
+std::string json_encode(const techempower_outjson_t &json_reflectobj)
+	{
+ 
+    std::stringstream _stream;
+    _stream << "{"; 
+    _stream << "\"message\":\"" << http::utf8_to_jsonstring(json_reflectobj.message)<< "\"";
+                
+    _stream << "}";
+
+    return _stream.str();
+            
+	}
+
+
+std::string json_encode(const std::vector<techempower_outjson_t> &json_reflectobj)
+        {
+        std::stringstream _stream;
+        _stream << "["; 
+    
+            for(unsigned int i=0;i<json_reflectobj.size();i++) 
+            {
+                if(i>0)
+                {
+                    _stream <<",";
+                }
+                _stream <<json_encode(json_reflectobj[i]);
+            }
+    
+        _stream << "]";
+
+        return _stream.str();
+        }
+              
+     unsigned int json_decode(techempower_outjson_t &json_reflectobj,const std::string &_json_data,unsigned int _offset)
+     {           
+             bool _isarray=false;
+        for(;_offset<_json_data.size();_offset++)
+        {
+            if(_json_data[_offset]=='{')
+            {
+                break;
+            }
+            if(_json_data[_offset]=='[')
+            {
+                _isarray=true;
+                break;
+            }
+        }
+
+        if(_isarray)
+        {
+            for(;_offset<_json_data.size();_offset++)
+            {
+                if(_json_data[_offset]=='{')
+                {
+                    _isarray=false;
+                    break;
+                }   
+            }
+        }
+
+        if(_isarray==false)
+        {
+            if(_json_data[_offset]=='{')
+            {
+                _offset++;
+            }
+            std::string _json_key_name,_json_value_name;
+            for(;_offset<_json_data.size();_offset++)
+            {
+
+                //去除空格
+                _offset=http::json_string_trim(_json_data,_offset);
+                //如果是右侧括号表示这个对象已经结束
+                if(_json_data[_offset]==0x7D)
+                {
+                    return _offset;
+                }
+                //直到引号
+                if(_json_data[_offset]==0x22)
+                {
+                    unsigned int temp_offset=_offset;
+                    _json_value_name.clear();
+                    _json_key_name=http::jsonstring_to_utf8(&_json_data[_offset],_json_data.size()-_offset,temp_offset);
+
+                    _offset=temp_offset;
+                    if(_offset < _json_data.size() &&_json_data[_offset]==0x22)
+                    {
+                        _offset+=1;
+                    }
+                    //键名 后就是键值类型 循环去除空格
+                    _offset=http::json_string_trim(_json_data,_offset);
+                    if(_offset < _json_data.size() &&_json_data[_offset]!=':')
+                    {
+                        return _offset; 
+                    }
+                    _offset++;
+                    _offset=http::json_string_trim(_json_data,_offset);
+                    
+                    if(_offset < _json_data.size() &&_json_data[_offset]=='{')
+                    {   //还是一个对象,表示有嵌套对象
+                        //1 内置 struct map<std::string,*>
+                        //递归代码
+                    
+                            _offset++;
+                            for ( ; _offset < _json_data.size(); _offset++)
+                            {
+                                if (_json_data[_offset] == '}')
+                                {
+                                    //offset++;
+                                    break;
+                                }
+                                if (_json_data[_offset] == '"')
+                                {
+                                    _offset++;
+                                    for ( ; _offset < _json_data.size(); _offset++)
+                                    {
+                                        if (_json_data[_offset] == '"'&&_json_data[_offset-1]!=0x5C)
+                                        {
+                                            break;
+                                        }
+                                    }
+                                }
+                            }
+                                                
+
+                        if(_offset < _json_data.size() && (_json_data[_offset]==']'||_json_data[_offset]=='}'))
+                        {
+                            _offset-=1;
+                        }
+                        //直接下一个,不用处理键值
+                        continue;   
+                    }
+                    else if(_json_data[_offset]=='[')
+                    {   //表示有数组 
+                        //////////////////////////////////////////////////////////////////////
+                        //begin level1 []
+                        //vector<std::string> vector<std::pair<std::string,*>>   vector<vector<int|long|float|double>>
+                        //如果是非内置类型 直接使用json_decode<>
+
+                        //递归代码     
+
+                    
+                            _offset++;
+                            for ( ; _offset < _json_data.size(); _offset++)
+                            {
+                                if (_json_data[_offset] == ']')
+                                {
+                                    //offset++;
+                                    break;
+                                }
+                                if (_json_data[_offset] == '"')
+                                {
+                                    _offset++;
+                                    for ( ; _offset < _json_data.size(); _offset++)
+                                    {
+                                        if (_json_data[_offset] == '"'&&_json_data[_offset-1]!=0x5C)
+                                        {
+                                            break;
+                                        }
+                                    }
+                                }
+                            }
+                        
+                        //直接下一个,不用处理键值
+                        if(_offset < _json_data.size() && (_json_data[_offset]==']'||_json_data[_offset]=='}'))
+                        {
+                            _offset-=1;
+                        }
+                        continue;    
+                        //end level1[]
+                        ////////////////////////////////////////////////////////////////////
+                    }
+                    else if(_json_data[_offset]==0x22)
+                    {
+                        //如果键值也是字符串
+                        temp_offset=_offset;
+                        _json_value_name=http::jsonstring_to_utf8(&_json_data[_offset],_json_data.size()-_offset,temp_offset);
+                        _offset=temp_offset;
+                        if(_json_data[_offset]==0x22)
+                        {
+                            if((_offset+1)<_json_data.size())
+                            {
+                                if(_json_data[_offset+1]!=']'&&_json_data[_offset+1]!='}')
+                                {
+                                    _offset+=1;
+                                }
+                            }
+                        }
+                    }
+                    else
+                    {
+                        //表示是数字 bool NULL
+                        for(;_offset<_json_data.size();_offset++)
+                        {
+                            //结束条件
+                            if(_json_data[_offset]==','||_json_data[_offset]==']'||_json_data[_offset]=='}'||_json_data[_offset]==0x20||_json_data[_offset]==0x0A||_json_data[_offset]==0x0D||_json_data[_offset]=='\t')
+                            {
+                                break;
+                            }
+                            _json_value_name.push_back(_json_data[_offset]);
+                        }
+                        //让前面循环退出或返回
+                        if(_offset < _json_data.size() && _json_data[_offset]=='}')
+                        {
+                            _offset-=1;
+                        }
+                    }
+                    ////////////////////////////////////////////////////////
+                    // level1
+                    //处理对象赋值
+                    if (http::str_casecmp(_json_key_name, "message"))
+                            {
+
+                                json_reflectobj.message=_json_value_name;     
+                            }
+                            
+                    ////////////////////////////////////////////////////////
+                    //继续循环下一个键值
+                    continue;
+                }
+            }
+        }
+        return _offset;
+    }
+  
+unsigned int json_decode(std::vector<techempower_outjson_t> &json_reflectobj,const std::string &_json_data,unsigned int _offset)
+      {          
+             bool _isarray=false;
+        for(;_offset<_json_data.size();_offset++)
+        {
+            if(_json_data[_offset]=='{')
+            {
+                break;
+            }
+            if(_json_data[_offset]=='[')
+            {
+                _isarray=true;
+                break;
+            }
+        }
+
+        if(_isarray)
+        {
+            if(_json_data[_offset]=='[')
+            {
+                _offset+=1;
+            }
+            for(;_offset<_json_data.size();_offset++)
+            {
+                _offset=http::json_string_trim(_json_data,_offset);
+                //直接返回,这样可以防插入空的对象
+                if(_json_data[_offset]==0x5D)
+                {
+                    return _offset;
+                }else if(_json_data[_offset]=='{')
+                {
+                    techempower_outjson_t temp;
+                    _offset=json_decode(temp,_json_data,_offset);
+                    json_reflectobj.push_back(temp);
+                }
+
+            }
+            
+        }
+        else
+        {
+            techempower_outjson_t temp;
+            _offset=json_decode(temp,_json_data,_offset);
+            json_reflectobj.push_back(temp);
+            
+        }
+
+        return _offset; 
+    }
+         
+}

+ 2 - 2
frameworks/C++/userver/userver_configs/static_config.yaml

@@ -1,7 +1,7 @@
 # yaml
 components_manager:
     event_thread_pool:
-        threads: 5
+        threads: 9
         dedicated_timer_threads: 1
     coro_pool:
         initial_size: 10000              # Preallocate 10000 coroutines at startup.
@@ -12,7 +12,7 @@ components_manager:
 
         main-task-processor:            # Make a task processor for CPU-bound couroutine tasks.
             thread_name: main-worker    # OS will show the threads of this task processor with 'main-worker' prefix.
-            worker_threads: 23
+            worker_threads: 46
             guess-cpu-limit: true
 
         fs-task-processor:              # Make a separate task processor for filesystem bound tasks.

+ 3 - 3
frameworks/C/h2o/h2o.dockerfile

@@ -1,4 +1,4 @@
-ARG UBUNTU_VERSION=22.04
+ARG UBUNTU_VERSION=24.04
 
 ARG H2O_APP_PREFIX=/opt/h2o_app
 
@@ -25,6 +25,7 @@ RUN apt-get -yqq update && \
       libwslay-dev \
       libyajl-dev \
       libz-dev \
+      llvm-dev \
       make \
       ninja-build \
       pkg-config \
@@ -46,8 +47,7 @@ RUN curl -LSs "https://github.com/h2o/h2o/archive/${H2O_VERSION}.tar.gz" | \
       -G Ninja \
       -S . && \
     cmake --build build -j && \
-    cmake --install build && \
-    cp -a deps/picotls/include/picotls* deps/quicly/include/quicly* /usr/local/include
+    cmake --install build
 
 ARG MUSTACHE_C_REVISION=7fe52392879d0188c172d94bb4fde7c513d6b929
 

+ 120 - 79
frameworks/C/h2o/src/database.c

@@ -75,7 +75,7 @@ static void on_database_write_ready(h2o_socket_t *sock, const char *err);
 static void on_process_queries(void *arg);
 static void poll_database_connection(h2o_socket_t *sock, const char *err);
 static void prepare_statements(db_conn_t *conn);
-static void process_queries(db_conn_t *conn, bool removed);
+static void process_queries(db_conn_pool_t *pool);
 static void remove_connection(db_conn_t *conn);
 static void start_database_connect(db_conn_pool_t *pool, db_conn_t *conn);
 
@@ -237,7 +237,10 @@ static void on_database_connect_read_ready(h2o_socket_t *sock, const char *err)
 					h2o_timer_unlink(&conn->timer);
 					h2o_socket_read_stop(conn->sock);
 					h2o_socket_read_start(conn->sock, on_database_read_ready);
-					process_queries(conn, true);
+					*conn->pool->conn.tail = &conn->l;
+					conn->pool->conn.tail = &conn->l.next;
+					conn->l.next = NULL;
+					process_queries(conn->pool);
 					return;
 				default:
 					LIBRARY_ERROR("PQresultStatus", PQresultErrorMessage(result));
@@ -370,7 +373,13 @@ static void on_database_read_ready(h2o_socket_t *sock, const char *err)
 	for (PGnotify *notify = PQnotifies(conn->conn); notify; notify = PQnotifies(conn->conn))
 		PQfreemem(notify);
 
-	process_queries(conn, removed);
+	if (removed && conn->query_num) {
+		*conn->pool->conn.tail = &conn->l;
+		conn->pool->conn.tail = &conn->l.next;
+		conn->l.next = NULL;
+	}
+
+	process_queries(conn->pool);
 }
 
 static void on_database_timeout(h2o_timer_t *timer)
@@ -405,20 +414,83 @@ static void on_database_write_ready(h2o_socket_t *sock, const char *err)
 
 static void on_process_queries(void *arg)
 {
+	list_t *iter = NULL;
 	db_conn_pool_t * const pool = arg;
+	size_t query_num = 0;
 
-	while (pool->queries.head && pool->conn) {
-		db_conn_t * const conn = H2O_STRUCT_FROM_MEMBER(db_conn_t, l, pool->conn);
+	while (pool->queries.head && pool->conn.head) {
+		db_conn_t * const conn = H2O_STRUCT_FROM_MEMBER(db_conn_t, l, pool->conn.head);
+		db_query_param_t * const param = H2O_STRUCT_FROM_MEMBER(db_query_param_t,
+		                                                        l,
+		                                                        conn->pool->queries.head);
 
-		pool->conn = conn->l.next;
 		assert(conn->query_num);
-		process_queries(conn, true);
+		assert(pool->query_num < pool->config->max_query_num);
+		pool->conn.head = conn->l.next;
+		pool->queries.head = param->l.next;
+
+		if (!pool->conn.head) {
+			assert(pool->conn.tail == &conn->l.next);
+			pool->conn.tail = &pool->conn.head;
+		}
+
+		if (++pool->query_num == pool->config->max_query_num) {
+			assert(!pool->queries.head);
+			assert(pool->queries.tail == &param->l.next);
+			pool->queries.tail = &pool->queries.head;
+		}
+
+		if (do_execute_query(conn, param)) {
+			param->on_error(param, DB_ERROR);
+			on_database_error(conn, DB_ERROR);
+		}
+		else {
+			query_num++;
+
+			if (conn->query_num) {
+				*pool->conn.tail = &conn->l;
+				pool->conn.tail = &conn->l.next;
+				conn->l.next = NULL;
+			}
+			else {
+				conn->l.next = iter;
+				iter = &conn->l;
+			}
+		}
 	}
 
-	if (pool->queries.head && pool->conn_num)
-		start_database_connect(pool, NULL);
+	if (iter)
+		do {
+			db_conn_t * const conn = H2O_STRUCT_FROM_MEMBER(db_conn_t, l, iter);
+
+			iter = conn->l.next;
+
+			if (flush_connection(on_database_write_ready, conn))
+				on_database_error(conn, DB_ERROR);
+		} while (iter);
 
+	pool->conn.tail = &pool->conn.head;
 	pool->process_queries = false;
+	query_num += pool->config->max_query_num - pool->query_num;
+
+	for (iter = pool->conn.head; iter;) {
+		db_conn_t * const conn = H2O_STRUCT_FROM_MEMBER(db_conn_t, l, iter);
+
+		iter = conn->l.next;
+
+		if (flush_connection(on_database_write_ready, conn)) {
+			*pool->conn.tail = iter;
+			on_database_error(conn, DB_ERROR);
+		}
+		else
+			pool->conn.tail = &conn->l.next;
+	}
+
+	const size_t conn_num = pool->config->max_db_conn_num - pool->conn_num;
+
+	if (query_num > conn_num)
+		for (query_num -= conn_num; pool->conn_num && query_num; query_num--)
+			start_database_connect(pool, NULL);
 }
 
 static void poll_database_connection(h2o_socket_t *sock, const char *err)
@@ -536,54 +608,44 @@ static void prepare_statements(db_conn_t *conn)
 	}
 	else {
 		h2o_socket_read_start(conn->sock, on_database_read_ready);
-		process_queries(conn, true);
+		*conn->pool->conn.tail = &conn->l;
+		conn->pool->conn.tail = &conn->l.next;
+		conn->l.next = NULL;
+		process_queries(conn->pool);
 	}
 }
 
-static void process_queries(db_conn_t *conn, bool removed)
+static void process_queries(db_conn_pool_t *pool)
 {
-	const bool flush = conn->query_num && conn->pool->queries.head;
-
-	while (conn->query_num && conn->pool->queries.head) {
-		db_query_param_t * const param = H2O_STRUCT_FROM_MEMBER(db_query_param_t,
-		                                                        l,
-		                                                        conn->pool->queries.head);
-
-		if (++conn->pool->query_num == conn->pool->config->max_query_num) {
-			assert(conn->pool->queries.tail == &param->l.next);
-			conn->pool->queries.tail = &conn->pool->queries.head;
-		}
-
-		conn->pool->queries.head = param->l.next;
-
-		if (do_execute_query(conn, param)) {
-			param->on_error(param, DB_ERROR);
-			on_database_error(conn, DB_ERROR);
-			return;
-		}
-	}
-
-	if (flush && flush_connection(on_database_write_ready, conn))
-		on_database_error(conn, DB_ERROR);
-	else if (conn->query_num && removed) {
-		conn->l.next = conn->pool->conn;
-		conn->pool->conn = &conn->l;
+	if (!pool->process_queries && pool->queries.head) {
+		task_message_t * const msg = h2o_mem_alloc(sizeof(*msg));
+
+		assert(pool->query_num < pool->config->max_query_num);
+		memset(msg, 0, sizeof(*msg));
+		msg->arg = pool;
+		msg->super.type = TASK;
+		msg->task = on_process_queries;
+		pool->process_queries = true;
+		send_local_message(&msg->super, pool->local_messages);
 	}
-	else if (!conn->query_num && !removed)
-		// This call should not be problematic, assuming a relatively low number of connections.
-		remove_connection(conn);
 }
 
 static void remove_connection(db_conn_t *conn)
 {
-	list_t *iter = conn->pool->conn;
-	list_t **prev = &conn->pool->conn;
+	list_t *iter = conn->pool->conn.head;
+	list_t **prev = &conn->pool->conn.head;
 
 	for (; iter && iter != &conn->l; iter = iter->next)
 		prev = &iter->next;
 
-	if (iter)
+	if (iter) {
 		*prev = iter->next;
+
+		if (!conn->pool->conn.head) {
+			assert(conn->pool->conn.tail == &iter->next);
+			conn->pool->conn.tail = &conn->pool->conn.head;
+		}
+	}
 }
 
 static void start_database_connect(db_conn_pool_t *pool, db_conn_t *conn)
@@ -661,37 +723,15 @@ int execute_database_query(db_conn_pool_t *pool, db_query_param_t *param)
 	int ret = 1;
 
 	if (pool->query_num) {
-		if (pool->conn) {
-			// Delay sending the database queries to the server, so that if there is a rapid
-			// succession of calls to this function, all resultant queries would be inserted
-			// into a command pipeline with a smaller number of system calls.
-			if (!pool->process_queries) {
-				task_message_t * const msg = h2o_mem_alloc(sizeof(*msg));
-
-				memset(msg, 0, sizeof(*msg));
-				msg->arg = pool;
-				msg->super.type = TASK;
-				msg->task = on_process_queries;
-				send_local_message(&msg->super, pool->local_messages);
-				pool->process_queries = true;
-			}
-
-			ret = 0;
-		}
-		else {
-			if (pool->conn_num)
-				start_database_connect(pool, NULL);
-
-			if (pool->conn_num < pool->config->max_db_conn_num && pool->query_num)
-				ret = 0;
-		}
-
-		if (!ret) {
-			param->l.next = NULL;
-			*pool->queries.tail = &param->l;
-			pool->queries.tail = &param->l.next;
-			pool->query_num--;
-		}
+		// Delay sending the database queries to the server, so that if there is a rapid
+		// succession of calls to this function, all resultant queries would be inserted
+		// into a command pipeline with a smaller number of system calls.
+		param->l.next = NULL;
+		*pool->queries.tail = &param->l;
+		pool->queries.tail = &param->l.next;
+		pool->query_num--;
+		process_queries(pool);
+		ret = 0;
 	}
 
 	return ret;
@@ -704,9 +744,9 @@ void free_database_connection_pool(db_conn_pool_t *pool)
 
 	size_t num = 0;
 
-	if (pool->conn)
+	if (pool->conn.head)
 		do {
-			db_conn_t * const conn = H2O_STRUCT_FROM_MEMBER(db_conn_t, l, pool->conn);
+			db_conn_t * const conn = H2O_STRUCT_FROM_MEMBER(db_conn_t, l, pool->conn.head);
 
 			assert(!conn->queries.head);
 			assert(conn->query_num == pool->config->max_pipeline_query_num);
@@ -715,10 +755,10 @@ void free_database_connection_pool(db_conn_pool_t *pool)
 			h2o_socket_read_stop(conn->sock);
 			h2o_socket_close(conn->sock);
 			PQfinish(conn->conn);
-			pool->conn = pool->conn->next;
-			free(conn);
+			pool->conn.head = conn->l.next;
 			num++;
-		} while (pool->conn);
+			free(conn);
+		} while (pool->conn.head);
 
 	assert(num + pool->conn_num == pool->config->max_db_conn_num);
 }
@@ -732,6 +772,7 @@ void initialize_database_connection_pool(const char *conninfo,
 {
 	memset(pool, 0, sizeof(*pool));
 	pool->config = config;
+	pool->conn.tail = &pool->conn.head;
 	pool->conninfo = conninfo ? conninfo : "";
 	pool->local_messages = local_messages;
 	pool->loop = loop;

+ 1 - 1
frameworks/C/h2o/src/database.h

@@ -60,7 +60,7 @@ typedef struct db_query_param_t {
 
 typedef struct {
 	const struct config_t *config;
-	list_t *conn;
+	queue_t conn;
 	const char *conninfo;
 	h2o_linklist_t *local_messages;
 	h2o_loop_t *loop;

+ 4 - 3
frameworks/C/h2o/src/handlers/world.c

@@ -416,7 +416,7 @@ static void fetch_from_cache(uint64_t now,
 		h2o_cache_ref_t * const r = h2o_cache_fetch(data->world_cache, now, key, 0);
 
 		if (r) {
-			const uint32_t * const table = (const uint32_t *) r->value.base;
+			const uint16_t * const table = (const uint16_t *) r->value.base;
 
 			for (size_t i = 0; i < query_ctx->num_query; i++) {
 				const uint32_t id = query_ctx->res[i].id;
@@ -440,7 +440,7 @@ static void fetch_from_cache(uint64_t now,
 			memset(ctx, 0, sizeof(*ctx));
 			ctx->data = data;
 			ctx->loop = query_ctx->ctx->event_loop.h2o_ctx.loop;
-			ctx->table.len = (MAX_ID + 1) * sizeof(uint32_t);
+			ctx->table.len = (MAX_ID + 1) * sizeof(uint16_t);
 			ctx->table.base = h2o_mem_alloc(ctx->table.len);
 			memset(ctx->table.base, 0, ctx->table.len);
 			ctx->param.command = POPULATE_CACHE_QUERY;
@@ -605,10 +605,11 @@ static result_return_t on_populate_cache_result(db_query_param_t *param, PGresul
 		                                                                param,
 		                                                                param);
 		query_result_t r = {.id = 0};
-		uint32_t * const table = (uint32_t *) query_ctx->table.base;
+		uint16_t * const table = (uint16_t *) query_ctx->table.base;
 
 		for (size_t i = 0; i < num_rows; i++) {
 			process_result(result, i, &r);
+			assert(r.random_number <= UINT16_MAX);
 			table[r.id] = r.random_number;
 		}
 

+ 1 - 4
frameworks/CSharp/appmpower/src/Data/DbConnection.cs

@@ -142,10 +142,7 @@ namespace appMpower.Data
 
       public async Task OpenAsync()
       {
-#if ADO && SQLSERVER
-         _internalConnection = new();
-         _internalConnection.DbConnection = new System.Data.SqlClient.SqlConnection(_connectionString);
-#elif ADO && POSTGRESQL
+#if ADO && POSTGRESQL
          _internalConnection = new(); 
          _internalConnection.DbConnection = new Npgsql.NpgsqlConnection(_connectionString);
 #else

+ 1 - 1
frameworks/CSharp/appmpower/src/Data/DbConnections.cs

@@ -7,7 +7,7 @@ namespace appMpower.Data
    {
       private static bool _connectionsCreated = false;
       private static short _createdConnections = 0;
-      private static short _maxConnections = 250;
+      private static short _maxConnections = 500;
 
       private static ConcurrentStack<InternalConnection> _stack = new();
       private static ConcurrentQueue<TaskCompletionSource<InternalConnection>> _waitingQueue = new();

+ 2 - 1
frameworks/CSharp/appmpower/src/HttpApplication.cs

@@ -35,7 +35,8 @@ namespace appMpower
 
             if (pathStringLength == 10 && pathStringStart == "p")
             {
-               await PlainText.RenderAsync(httpResponse.Headers, httpResponseBody.Writer, _plainText);
+               //await PlainText.RenderAsync(httpResponse.Headers, httpResponseBody.Writer, _plainText);
+               PlainText.Render(httpResponse.Headers, httpResponseBody, _plainText);
                return;
             }
             else if (pathStringLength == 5 && pathStringStart == "j")

+ 11 - 0
frameworks/CSharp/appmpower/src/Kestrel/PlainText.cs

@@ -4,6 +4,7 @@ using System.Collections.Generic;
 using System.IO.Pipelines;
 using Microsoft.AspNetCore.Http;
 using Microsoft.Extensions.Primitives;
+using Microsoft.AspNetCore.Http.Features;
 
 namespace appMpower.Kestrel
 {
@@ -23,5 +24,15 @@ namespace appMpower.Kestrel
          await pipeWriter.WriteAsync(utf8String);
          pipeWriter.Complete();
       }
+
+      public static void Render(IHeaderDictionary headerDictionary, IHttpResponseBodyFeature httpResponseBodyFeature, byte[] utf8String)
+      {
+         headerDictionary.Add(_headerServer);
+         headerDictionary.Add(_headerContentType);
+         int length = utf8String.Length;
+         headerDictionary.Add(new KeyValuePair<string, StringValues>("Content-Length", length.ToString()));
+
+         httpResponseBodyFeature.Stream.Write(utf8String, 0, length);
+      }
    }
 }

+ 1 - 0
frameworks/CSharp/appmpower/src/Program.cs

@@ -19,6 +19,7 @@ namespace appMpower
          var kestrelServerOptions = new KestrelServerOptions();
 
          kestrelServerOptions.Listen(IPAddress.Any, 8080);
+         kestrelServerOptions.AllowSynchronousIO = true; 
          kestrelServerOptions.AddServerHeader = false;
 
          using var kestrelServer = new KestrelServer(Options.Create(kestrelServerOptions), socketTransportFactory, NullLoggerFactory.Instance);

+ 1 - 1
frameworks/CSharp/appmpower/src/appMpower.csproj

@@ -43,7 +43,7 @@
 
   <ItemGroup>
     <PackageReference Include="System.Data.Odbc" Version="8.0.0" />
-    <PackageReference Include="Npgsql" Version="8.0.0-*" />
+    <PackageReference Include="Npgsql" Version="8.0.2-*" />
   </ItemGroup>
 
   <PropertyGroup>

+ 1 - 0
frameworks/CSharp/aspnetcore-mono/Benchmarks/Benchmarks.csproj

@@ -25,6 +25,7 @@
 
     <PackageReference Include="Dapper" Version="2.0.90" />
     <PackageReference Include="MySqlConnector" Version="1.0.1" />
+    <PackageReference Include="Npgsql" Version="8.0.3" />
     <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="5.0.0-rc1" />
     <PackageReference Include="System.IO.Pipelines" Version="5.0.0-rc.1.20451.14" />
   </ItemGroup>

+ 1 - 1
frameworks/CSharp/aspnetcore-mono/PlatformBenchmarks/PlatformBenchmarks.csproj

@@ -23,7 +23,7 @@
   </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Include="Npgsql" Version="5.0.0-alpha1" />
+    <PackageReference Include="Npgsql" Version="8.0.3" />
     <PackageReference Include="System.IO.Pipelines" Version="5.0.0-rc.1.20451.14" />
   </ItemGroup>
 

+ 1 - 1
frameworks/CSharp/aspnetcore/src/Minimal/Minimal.csproj

@@ -9,7 +9,7 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="Npgsql" Version="8.0.1" />
+    <PackageReference Include="Npgsql" Version="8.0.3" />
     <PackageReference Include="Dapper" Version="2.1.21" />
     <PackageReference Include="RazorSlices" Version="0.7.0" />
   </ItemGroup>

+ 1 - 1
frameworks/CSharp/aspnetcore/src/Mvc/Mvc.csproj

@@ -9,7 +9,7 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="Npgsql" Version="8.0.0-rc.2" />
+    <PackageReference Include="Npgsql" Version="8.0.3" />
     <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="8.0.0-rc.2" />
   </ItemGroup>
 

+ 1 - 1
frameworks/CSharp/aspnetcore/src/Platform/Platform.csproj

@@ -19,7 +19,7 @@
   </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Include="Npgsql" Version="8.0.1" />
+    <PackageReference Include="Npgsql" Version="8.0.3" />
     <PackageReference Include="MySqlConnector" Version="2.3.1" />
     <PackageReference Include="Dapper" Version="2.1.21" />
     <PackageReference Include="RazorSlices" Version="0.7.0" Condition="$(PublishAot) != 'true'" />

+ 5 - 5
frameworks/CSharp/genhttp/Benchmarks/Benchmarks.csproj

@@ -28,12 +28,12 @@
     
   <ItemGroup>
 	  
-    <PackageReference Include="GenHTTP.Core" Version="8.0.0" />
-    <PackageReference Include="GenHTTP.Modules.Razor" Version="8.0.0" />
-    <PackageReference Include="GenHTTP.Modules.Webservices" Version="8.0.0" />
+    <PackageReference Include="GenHTTP.Core" Version="8.3.1" />
+    <PackageReference Include="GenHTTP.Modules.Razor" Version="8.3.0" />
+    <PackageReference Include="GenHTTP.Modules.Webservices" Version="8.3.0" />
 	  
-    <PackageReference Include="Microsoft.EntityFrameworkCore" Version="8.0.0" />
-    <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="8.0.0" />
+    <PackageReference Include="Microsoft.EntityFrameworkCore" Version="8.0.4" />
+    <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="8.0.2" />
 	  
   </ItemGroup>
   

+ 1 - 1
frameworks/CSharp/sisk/sisk/sisk.csproj

@@ -9,7 +9,7 @@
 	</PropertyGroup>
 
 	<ItemGroup>
-	  <PackageReference Include="Sisk.HttpServer" Version="0.16.0-rc-5" />
+	  <PackageReference Include="Sisk.HttpServer" Version="0.16.2" />
 	</ItemGroup>
 
 </Project>

+ 1 - 1
frameworks/Crystal/crystal/crystal-radix.dockerfile

@@ -1,4 +1,4 @@
-FROM crystallang/crystal:1.0.0
+FROM crystallang/crystal:1.12.1
 
 WORKDIR /crystal
 COPY shard.yml shard.yml

+ 1 - 1
frameworks/Crystal/crystal/crystal.dockerfile

@@ -1,4 +1,4 @@
-FROM crystallang/crystal:1.0.0
+FROM crystallang/crystal:1.12.1
 
 WORKDIR /crystal
 COPY shard.yml shard.yml

+ 1 - 1
frameworks/Crystal/crystal/shard.yml

@@ -7,7 +7,7 @@ crystal: "~> 1.0"
 dependencies:
   pg:
     github: will/crystal-pg
-    version: ~> 0.23.2
+    version: ~> 0.28.0
   radix:
     github: luislavena/radix
     version: ~> 0.4.1

+ 1 - 1
frameworks/Crystal/lucky/lucky.dockerfile

@@ -1,4 +1,4 @@
-FROM crystallang/crystal:1.1.0
+FROM crystallang/crystal:1.12.1
 
 WORKDIR /lucky
 COPY shard.lock shard.lock

+ 28 - 20
frameworks/Crystal/lucky/shard.lock

@@ -2,11 +2,15 @@ version: 2.0
 shards:
   avram:
     git: https://github.com/luckyframework/avram.git
-    version: 0.21.0
+    version: 1.2.0
 
   backtracer:
     git: https://github.com/sija/backtracer.cr.git
-    version: 1.2.1
+    version: 1.2.2
+
+  cadmium_transliterator:
+    git: https://github.com/cadmiumcr/transliterator.git
+    version: 0.1.0+git.commit.46c4c14594057dbcfaf27e7e7c8c164d3f0ce3f1
 
   cry:
     git: https://github.com/luckyframework/cry.git
@@ -14,53 +18,57 @@ shards:
 
   db:
     git: https://github.com/crystal-lang/crystal-db.git
-    version: 0.10.1
+    version: 0.13.1
 
   dexter:
     git: https://github.com/luckyframework/dexter.git
-    version: 0.3.3
+    version: 0.3.4
 
   exception_page:
     git: https://github.com/crystal-loot/exception_page.git
-    version: 0.2.0
-
-  future:
-    git: https://github.com/crystal-community/future.cr.git
-    version: 1.0.0+git.commit.9fe168418c6884cb3552c13b004763eb4815ceb9
+    version: 0.4.1
 
   habitat:
     git: https://github.com/luckyframework/habitat.git
-    version: 0.4.7
+    version: 0.4.8
 
   lucky:
     git: https://github.com/luckyframework/lucky.git
-    version: 0.28.0
+    version: 1.2.0
+
+  lucky_cache:
+    git: https://github.com/luckyframework/lucky_cache.git
+    version: 0.1.1
 
   lucky_router:
     git: https://github.com/luckyframework/lucky_router.git
-    version: 0.5.0
+    version: 0.5.2
 
   lucky_task:
     git: https://github.com/luckyframework/lucky_task.git
-    version: 0.1.0
+    version: 0.3.0
+
+  lucky_template:
+    git: https://github.com/luckyframework/lucky_template.git
+    version: 0.2.0
 
   pg:
     git: https://github.com/will/crystal-pg.git
-    version: 0.24.0
+    version: 0.28.0
 
   pulsar:
     git: https://github.com/luckyframework/pulsar.git
-    version: 0.2.2
+    version: 0.2.3
 
   shell-table:
     git: https://github.com/luckyframework/shell-table.cr.git
-    version: 0.9.3+git.commit.fefbc8b19d18630660b2653de755217597808b1b
+    version: 0.9.3
 
-  teeplate:
-    git: https://github.com/luckyframework/teeplate.git
-    version: 0.8.3
+  splay_tree_map:
+    git: https://github.com/wyhaines/splay_tree_map.cr.git
+    version: 0.2.2
 
   wordsmith:
     git: https://github.com/luckyframework/wordsmith.git
-    version: 0.3.0
+    version: 0.4.0
 

+ 4 - 2
frameworks/Crystal/lucky/shard.yml

@@ -8,9 +8,11 @@ targets:
   bench:
     main: src/bench.cr
 
-crystal: ">= 1.0.0"
+crystal: ">= 1.12.1"
 
 dependencies:
+  avram:
+    github: luckyframework/avram
   lucky:
     github: luckyframework/lucky
-    version: ~> 0.28.0
+    version: ~> 1.2.0

+ 0 - 1
frameworks/Crystal/lucky/src/actions/mixins/add_required_headers.cr

@@ -5,7 +5,6 @@ module AddRequiredHeaders
 
   def add_required_headers
     response.headers["Server"] = "Lucky"
-    response.headers["Date"] = HTTP.format_time(Time.local)
     continue
   end
 end

+ 3 - 3
frameworks/Crystal/toro/shard.yml

@@ -4,13 +4,13 @@ version: 0.1.0
 dependencies:
   toro:
     github: soveran/toro
-    version: 0.4.1
+    version: 0.5.1
   pg:
     github: will/crystal-pg
-    version: 0.20.0
+    version: 0.28.0
 
 targets:
   toro:
     main: toro.cr
 
-crystal: 0.34.0
+crystal: 1.12.1

+ 1 - 1
frameworks/Crystal/toro/toro.cr

@@ -129,6 +129,6 @@ class App < Toro::Router
 end
 
 # Start the app on port 8080.
-App.run(8080) do |server|
+App.run do |server|
   server.listen("0.0.0.0", 8080, reuse_port: true)
 end

+ 1 - 1
frameworks/Crystal/toro/toro.dockerfile

@@ -1,4 +1,4 @@
-FROM crystallang/crystal:0.34.0
+FROM crystallang/crystal:1.12.1
 
 WORKDIR /toro
 COPY views views

+ 1 - 1
frameworks/FSharp/falco/src/App/App.fsproj

@@ -21,7 +21,7 @@
     <PackageReference Update="FSharp.Core" Version="7.0.0" />
     <PackageReference Include="Donald" Version="3.0.*" />
     <PackageReference Include="Falco" Version="2.0.*" />
-    <PackageReference Include="Npgsql" Version="7.0.0" />
+    <PackageReference Include="Npgsql" Version="8.0.3" />
   </ItemGroup>
 
 </Project>

+ 1 - 1
frameworks/FSharp/frank/src/App/App.fsproj

@@ -16,7 +16,7 @@
     <PackageReference Include="FSharp.Data.JsonSchema" Version="2.0.1" />
     <PackageReference Include="Giraffe" Version="6.0.0" />
     <PackageReference Include="Giraffe.ViewEngine" Version="2.0.0-alpha-1" />
-    <PackageReference Include="Npgsql" Version="7.0.0" />
+    <PackageReference Include="Npgsql" Version="8.0.3" />
     <PackageReference Update="FSharp.Core" Version="7.0.0" />
   </ItemGroup>
 

+ 1 - 2
frameworks/FSharp/giraffe/README.md

@@ -1,9 +1,8 @@
 # Giraffe Benchmarks on Linux
 
-This application tests Giraffe in 3 modes:
+This application tests Giraffe in 2 modes:
 
 - Default: Using Giraffe's Endpoint Routing APIs with the `System.Text.Json` serializer
-- Utf8Json: Testing the JSON endpoint with the `Utf8Json` serializer
 - Newtonsoft: Testing the JSON endpoint with the `NewtonsoftJson` serializer
 
 ## Infrastructure Software Versions

+ 1 - 1
frameworks/FSharp/giraffe/giraffe-newtonsoft.dockerfile

@@ -1,4 +1,4 @@
-FROM mcr.microsoft.com/dotnet/sdk:8.0.100 AS build
+FROM mcr.microsoft.com/dotnet/sdk:8.0.204 AS build
 WORKDIR /app
 COPY src/App .
 RUN dotnet publish -c Release -o out

+ 1 - 1
frameworks/FSharp/giraffe/giraffe.dockerfile

@@ -1,4 +1,4 @@
-FROM mcr.microsoft.com/dotnet/sdk:8.0.100 AS build
+FROM mcr.microsoft.com/dotnet/sdk:8.0.204 AS build
 WORKDIR /app
 COPY src/App .
 RUN dotnet publish -c Release -o out

+ 19 - 19
frameworks/FSharp/giraffe/src/App/App.fsproj

@@ -1,19 +1,19 @@
-<Project Sdk="Microsoft.NET.Sdk.Web">
-
-  <PropertyGroup>
-    <TargetFramework>net8.0</TargetFramework>
-    <EnableDefaultContentItems>false</EnableDefaultContentItems>
-  </PropertyGroup>
-
-  <ItemGroup>
-    <PackageReference Update="FSharp.Core" Version="8.0.100" />
-    <PackageReference Include="Dapper" Version="2.1.21" />
-    <PackageReference Include="Giraffe" Version="6.2.0" />
-    <PackageReference Include="Npgsql" Version="8.0.0-rc.2" />
-  </ItemGroup>
-
-  <ItemGroup>
-    <Compile Include="Program.fs" />
-  </ItemGroup>
-
-</Project>
+<Project Sdk="Microsoft.NET.Sdk.Web">
+
+  <PropertyGroup>
+    <TargetFramework>net8.0</TargetFramework>
+    <EnableDefaultContentItems>false</EnableDefaultContentItems>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <PackageReference Update="FSharp.Core" Version="8.0.200" />
+    <PackageReference Include="Dapper" Version="2.1.44" />
+    <PackageReference Include="Giraffe" Version="6.4.0" />
+    <PackageReference Include="Npgsql" Version="8.0.3" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <Compile Include="Program.fs" />
+  </ItemGroup>
+
+</Project>

+ 360 - 0
frameworks/FSharp/oxpecker/.gitignore

@@ -0,0 +1,360 @@
+## Ignore Visual Studio temporary files, build results, and
+## files generated by popular Visual Studio add-ons.
+##
+## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
+
+# User-specific files
+*.rsuser
+*.suo
+*.user
+*.userosscache
+*.sln.docstates
+
+# User-specific files (MonoDevelop/Xamarin Studio)
+*.userprefs
+
+# Mono auto generated files
+mono_crash.*
+
+# Build results
+[Dd]ebug/
+[Dd]ebugPublic/
+[Rr]elease/
+[Rr]eleases/
+x64/
+x86/
+[Ww][Ii][Nn]32/
+[Aa][Rr][Mm]/
+[Aa][Rr][Mm]64/
+bld/
+[Bb]in/
+[Oo]bj/
+[Ll]og/
+[Ll]ogs/
+
+# Visual Studio 2015/2017 cache/options directory
+.vs/
+# Uncomment if you have tasks that create the project's static files in wwwroot
+#wwwroot/
+
+# Visual Studio 2017 auto generated files
+Generated\ Files/
+
+# MSTest test Results
+[Tt]est[Rr]esult*/
+[Bb]uild[Ll]og.*
+
+# NUnit
+*.VisualState.xml
+TestResult.xml
+nunit-*.xml
+
+# Build Results of an ATL Project
+[Dd]ebugPS/
+[Rr]eleasePS/
+dlldata.c
+
+# Benchmark Results
+BenchmarkDotNet.Artifacts/
+
+# .NET Core
+project.lock.json
+project.fragment.lock.json
+artifacts/
+
+# ASP.NET Scaffolding
+ScaffoldingReadMe.txt
+
+# StyleCop
+StyleCopReport.xml
+
+# Files built by Visual Studio
+*_i.c
+*_p.c
+*_h.h
+*.ilk
+*.meta
+*.obj
+*.iobj
+*.pch
+*.pdb
+*.ipdb
+*.pgc
+*.pgd
+*.rsp
+*.sbr
+*.tlb
+*.tli
+*.tlh
+*.tmp
+*.tmp_proj
+*_wpftmp.csproj
+*.log
+*.vspscc
+*.vssscc
+.builds
+*.pidb
+*.svclog
+*.scc
+
+# Chutzpah Test files
+_Chutzpah*
+
+# Visual C++ cache files
+ipch/
+*.aps
+*.ncb
+*.opendb
+*.opensdf
+*.sdf
+*.cachefile
+*.VC.db
+*.VC.VC.opendb
+
+# Visual Studio profiler
+*.psess
+*.vsp
+*.vspx
+*.sap
+
+# Visual Studio Trace Files
+*.e2e
+
+# TFS 2012 Local Workspace
+$tf/
+
+# Guidance Automation Toolkit
+*.gpState
+
+# ReSharper is a .NET coding add-in
+_ReSharper*/
+*.[Rr]e[Ss]harper
+*.DotSettings.user
+
+# TeamCity is a build add-in
+_TeamCity*
+
+# DotCover is a Code Coverage Tool
+*.dotCover
+
+# AxoCover is a Code Coverage Tool
+.axoCover/*
+!.axoCover/settings.json
+
+# Coverlet is a free, cross platform Code Coverage Tool
+coverage*[.json, .xml, .info]
+
+# Visual Studio code coverage results
+*.coverage
+*.coveragexml
+
+# NCrunch
+_NCrunch_*
+.*crunch*.local.xml
+nCrunchTemp_*
+
+# MightyMoose
+*.mm.*
+AutoTest.Net/
+
+# Web workbench (sass)
+.sass-cache/
+
+# Installshield output folder
+[Ee]xpress/
+
+# DocProject is a documentation generator add-in
+DocProject/buildhelp/
+DocProject/Help/*.HxT
+DocProject/Help/*.HxC
+DocProject/Help/*.hhc
+DocProject/Help/*.hhk
+DocProject/Help/*.hhp
+DocProject/Help/Html2
+DocProject/Help/html
+
+# Click-Once directory
+publish/
+
+# Publish Web Output
+*.[Pp]ublish.xml
+*.azurePubxml
+# Note: Comment the next line if you want to checkin your web deploy settings,
+# but database connection strings (with potential passwords) will be unencrypted
+*.pubxml
+*.publishproj
+
+# Microsoft Azure Web App publish settings. Comment the next line if you want to
+# checkin your Azure Web App publish settings, but sensitive information contained
+# in these scripts will be unencrypted
+PublishScripts/
+
+# NuGet Packages
+*.nupkg
+# NuGet Symbol Packages
+*.snupkg
+# The packages folder can be ignored because of Package Restore
+**/[Pp]ackages/*
+# except build/, which is used as an MSBuild target.
+!**/[Pp]ackages/build/
+# Uncomment if necessary however generally it will be regenerated when needed
+#!**/[Pp]ackages/repositories.config
+# NuGet v3's project.json files produces more ignorable files
+*.nuget.props
+*.nuget.targets
+
+# Microsoft Azure Build Output
+csx/
+*.build.csdef
+
+# Microsoft Azure Emulator
+ecf/
+rcf/
+
+# Windows Store app package directories and files
+AppPackages/
+BundleArtifacts/
+Package.StoreAssociation.xml
+_pkginfo.txt
+*.appx
+*.appxbundle
+*.appxupload
+
+# Visual Studio cache files
+# files ending in .cache can be ignored
+*.[Cc]ache
+# but keep track of directories ending in .cache
+!?*.[Cc]ache/
+
+# Others
+ClientBin/
+~$*
+*~
+*.dbmdl
+*.dbproj.schemaview
+*.jfm
+*.pfx
+*.publishsettings
+orleans.codegen.cs
+
+# Including strong name files can present a security risk
+# (https://github.com/github/gitignore/pull/2483#issue-259490424)
+#*.snk
+
+# Since there are multiple workflows, uncomment next line to ignore bower_components
+# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
+#bower_components/
+
+# RIA/Silverlight projects
+Generated_Code/
+
+# Backup & report files from converting an old project file
+# to a newer Visual Studio version. Backup files are not needed,
+# because we have git ;-)
+_UpgradeReport_Files/
+Backup*/
+UpgradeLog*.XML
+UpgradeLog*.htm
+ServiceFabricBackup/
+*.rptproj.bak
+
+# SQL Server files
+*.mdf
+*.ldf
+*.ndf
+
+# Business Intelligence projects
+*.rdl.data
+*.bim.layout
+*.bim_*.settings
+*.rptproj.rsuser
+*- [Bb]ackup.rdl
+*- [Bb]ackup ([0-9]).rdl
+*- [Bb]ackup ([0-9][0-9]).rdl
+
+# Microsoft Fakes
+FakesAssemblies/
+
+# GhostDoc plugin setting file
+*.GhostDoc.xml
+
+# Node.js Tools for Visual Studio
+.ntvs_analysis.dat
+node_modules/
+
+# Visual Studio 6 build log
+*.plg
+
+# Visual Studio 6 workspace options file
+*.opt
+
+# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
+*.vbw
+
+# Visual Studio LightSwitch build output
+**/*.HTMLClient/GeneratedArtifacts
+**/*.DesktopClient/GeneratedArtifacts
+**/*.DesktopClient/ModelManifest.xml
+**/*.Server/GeneratedArtifacts
+**/*.Server/ModelManifest.xml
+_Pvt_Extensions
+
+# Paket dependency manager
+.paket/paket.exe
+paket-files/
+
+# FAKE - F# Make
+.fake/
+
+# CodeRush personal settings
+.cr/personal
+
+# Python Tools for Visual Studio (PTVS)
+__pycache__/
+*.pyc
+
+# Cake - Uncomment if you are using it
+# tools/**
+# !tools/packages.config
+
+# Tabs Studio
+*.tss
+
+# Telerik's JustMock configuration file
+*.jmconfig
+
+# BizTalk build output
+*.btp.cs
+*.btm.cs
+*.odx.cs
+*.xsd.cs
+
+# OpenCover UI analysis results
+OpenCover/
+
+# Azure Stream Analytics local run output
+ASALocalRun/
+
+# MSBuild Binary and Structured Log
+*.binlog
+
+# NVidia Nsight GPU debugger configuration file
+*.nvuser
+
+# MFractors (Xamarin productivity tool) working folder
+.mfractor/
+
+# Local History for Visual Studio
+.localhistory/
+
+# BeatPulse healthcheck temp database
+healthchecksdb
+
+# Backup folder for Package Reference Convert tool in Visual Studio 2017
+MigrationBackup/
+
+# Ionide (cross platform F# VS Code tools) working folder
+.ionide/
+
+# Fody - auto-generated XML schema
+FodyWeavers.xsd

+ 27 - 0
frameworks/FSharp/oxpecker/README.md

@@ -0,0 +1,27 @@
+# Oxpecker Tests on Linux
+This includes tests for plaintext, json, and fortunes HTML serialization.
+
+## Infrastructure Software Versions
+
+**Language**
+
+* F# 8.0
+
+**Platforms**
+
+* .NET Core (Windows and Linux)
+
+**Web Servers**
+
+* [Kestrel](https://github.com/dotnet/aspnetcore/tree/main/src/Servers/Kestrel)
+
+**Web Stack**
+
+* [Oxpecker](https://github.com/Lanayx/Oxpecker)
+* [Dapper](https://github.com/DapperLib/Dapper)
+* [SpanJson](https://github.com/Tornhoof/SpanJson)
+* ASP.NET Core
+
+## Paths & Source for Tests
+
+All source code is inside `Program.fs`.

+ 30 - 0
frameworks/FSharp/oxpecker/benchmark_config.json

@@ -0,0 +1,30 @@
+{
+  "framework": "oxpecker",
+  "tests": [
+    {
+      "default": {
+        "plaintext_url": "/plaintext",
+        "json_url": "/json",
+        "fortune_url": "/fortunes",
+        "db_url": "/db",
+        "query_url": "/queries/",
+        "update_url": "/updates/",
+        "port": 8080,
+        "approach": "Realistic",
+        "classification": "Micro",
+        "database": "Postgres",
+        "framework": "Oxpecker",
+        "language": "F#",
+        "orm": "Micro",
+        "platform": ".NET",
+        "flavor": "CoreCLR",
+        "webserver": "Kestrel",
+        "os": "Linux",
+        "database_os": "Linux",
+        "display_name": "Oxpecker",
+        "notes": "",
+        "versus": "aspcore"
+      }
+    }
+  ]
+}

+ 19 - 0
frameworks/FSharp/oxpecker/config.toml

@@ -0,0 +1,19 @@
+[framework]
+name = "oxpecker"
+
+[main]
+urls.plaintext = "/plaintext"
+urls.json = "/json"
+urls.fortune = "/fortunes"
+urls.db = "/db"
+urls.query = "/queries/"
+urls.update = "/updates/"
+approach = "Realistic"
+classification = "fullstack"
+database = "Postgres"
+database_os = "Linux"
+os = "Linux"
+orm = "micro"
+platform = ".NET"
+webserver = "Kestrel"
+versus = "aspcore"

+ 14 - 0
frameworks/FSharp/oxpecker/oxpecker.dockerfile

@@ -0,0 +1,14 @@
+FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
+WORKDIR /app
+COPY src/App .
+RUN dotnet publish -c Release -o out
+
+FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtime
+ENV URLS http://+:8080
+
+WORKDIR /app
+COPY --from=build /app/out ./
+
+EXPOSE 8080
+
+ENTRYPOINT ["dotnet", "App.dll"]

+ 19 - 0
frameworks/FSharp/oxpecker/src/App/App.fsproj

@@ -0,0 +1,19 @@
+<Project Sdk="Microsoft.NET.Sdk.Web">
+
+  <PropertyGroup>
+    <TargetFramework>net8.0</TargetFramework>
+    <EnableDefaultContentItems>false</EnableDefaultContentItems>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <Compile Include="Program.fs" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <PackageReference Update="FSharp.Core" Version="8.0.300" />
+    <PackageReference Include="Dapper" Version="2.1.44" />
+    <PackageReference Include="Oxpecker" Version="0.10.1" />
+    <PackageReference Include="Npgsql" Version="8.0.3" />
+    <PackageReference Include="SpanJson" Version="4.0.1" />
+  </ItemGroup>
+</Project>

+ 228 - 0
frameworks/FSharp/oxpecker/src/App/Program.fs

@@ -0,0 +1,228 @@
+namespace App
+
+open System
+open System.Collections.Generic
+open System.Threading.Tasks
+open Oxpecker
+
+[<AutoOpen>]
+module Common =
+
+    [<CLIMutable>]
+    type Fortune =
+        {
+            id      : int
+            message : string
+        }
+
+    [<Literal>]
+    let ConnectionString = "Server=tfb-database;Database=hello_world;User Id=benchmarkdbuser;Password=benchmarkdbpass;SSL Mode=Disable;Maximum Pool Size=1024;NoResetOnClose=true;Enlist=false;Max Auto Prepare=4;Multiplexing=true;Write Coalescing Buffer Threshold Bytes=1000"
+
+    let FortuneComparer = {
+        new IComparer<Fortune> with
+            member self.Compare(a,b) = String.CompareOrdinal(a.message, b.message)
+    }
+
+[<RequireQualifiedAccess>]
+module HtmlViews =
+    open Oxpecker.ViewEngine
+
+    let private fortunesHead =
+        head() {
+            title() { raw "Fortunes" }
+        }
+
+    let private layout (content: HtmlElement) =
+        html() {
+            fortunesHead
+            body() { content }
+        }
+
+    let private fortunesTableHeader =
+        tr() {
+            th() { raw "id" }
+            th() { raw "message" }
+        }
+
+    let fortunes (fortunes: Fortune[]) =
+        table() {
+            fortunesTableHeader
+            for f in fortunes do
+                tr() {
+                    td() { raw <| string f.id }
+                    td() { f.message }
+                }
+        } |> layout
+
+[<RequireQualifiedAccess>]
+module HttpHandlers =
+    open Dapper
+    open Npgsql
+    open System.Text
+    open Microsoft.AspNetCore.Http
+
+    let private extra =
+        {
+            id      = 0
+            message = "Additional fortune added at request time."
+        }
+
+    let private renderFortunes (ctx: HttpContext) dbFortunes =
+        let augmentedData = [|
+            yield! dbFortunes
+            extra
+        |]
+        Array.Sort(augmentedData, FortuneComparer)
+        augmentedData |> HtmlViews.fortunes |> ctx.WriteHtmlView
+
+    let private fortunes : EndpointHandler =
+        fun ctx ->
+            task {
+                use conn = new NpgsqlConnection(ConnectionString)
+                let! dbFortunes = conn.QueryAsync<Fortune>("SELECT id, message FROM fortune")
+                return! renderFortunes ctx dbFortunes
+            }
+
+    [<Struct>]
+    [<CLIMutable>]
+    type World =
+        {
+            id: int
+            randomnumber: int
+        }
+
+    let private readSingleRow (conn: NpgsqlConnection) =
+        conn.QueryFirstOrDefaultAsync<World>(
+            "SELECT id, randomnumber FROM world WHERE id = @Id",
+            {| Id = Random.Shared.Next(1, 10001) |}
+        )
+
+    let private parseQueries (ctx: HttpContext) =
+        match ctx.TryGetRouteValue<string>("count") with
+        | Some q ->
+            match Int32.TryParse q with
+            | true, q when q > 1 -> if q < 500 then q else 500
+            | _, _ -> 1
+        | _ -> 1
+
+    let private singleQuery : EndpointHandler =
+        fun ctx ->
+            task {
+                use conn = new NpgsqlConnection(ConnectionString)
+                let! result = readSingleRow conn
+                return! ctx.WriteJsonChunked result
+            }
+
+    let private multipleQueries : EndpointHandler =
+        fun ctx ->
+            let count = parseQueries ctx
+            let results = Array.zeroCreate<World> count
+            task {
+                use conn = new NpgsqlConnection(ConnectionString)
+                do! conn.OpenAsync()
+                for i in 0..results.Length-1 do
+                    let! result = readSingleRow conn
+                    results[i] <- result
+                return! ctx.WriteJsonChunked results
+            }
+
+    let private maxBatch = 500
+    let mutable private queries = Array.zeroCreate (maxBatch + 1)
+
+    let private batchUpdateString batchSize =
+        match queries[batchSize] with
+        | null ->
+            let lastIndex = batchSize - 1
+            let sb = StringBuilder()
+            sb.Append("UPDATE world SET randomNumber = temp.randomNumber FROM (VALUES ") |> ignore
+            for i in 0..lastIndex-1 do
+                sb.AppendFormat("(@Id_{0}, @Rn_{0}), ", i) |> ignore
+            sb.AppendFormat("(@Id_{0}, @Rn_{0}) ORDER BY 1) AS temp(id, randomNumber) WHERE temp.id = world.id", lastIndex) |> ignore
+            let result = sb.ToString()
+            queries[batchSize] <- result
+            result
+        | q -> q
+
+    let private multipleUpdates : EndpointHandler =
+        fun ctx ->
+            let count = parseQueries ctx
+            let results = Array.zeroCreate<World> count
+            task {
+                use conn = new NpgsqlConnection(ConnectionString)
+                do! conn.OpenAsync()
+                for i in 0..results.Length-1 do
+                    let! result = readSingleRow conn
+                    results[i] <- result
+                let parameters = Dictionary<string,obj>()
+                for i in 0..results.Length-1 do
+                    let randomNumber = Random.Shared.Next(1, 10001)
+                    parameters[$"@Rn_{i}"] <- randomNumber
+                    parameters[$"@Id_{i}"] <- results[i].id
+                    results[i] <- { results[i] with randomnumber = randomNumber }
+                let! _ = conn.ExecuteAsync(batchUpdateString count, parameters)
+                return! ctx.WriteJsonChunked results
+            }
+
+    let utf8Const (s: string): EndpointHandler =
+        let result = s |> Encoding.UTF8.GetBytes
+        fun ctx ->
+            ctx.SetContentType("text/plain")
+            ctx.WriteBytes(result)
+
+    let endpoints =
+        [|
+            route "/plaintext" <| utf8Const "Hello, World!"
+            route "/json"<| jsonChunked {| message = "Hello, World!" |}
+            route "/fortunes" fortunes
+            route "/db" singleQuery
+            route "/queries/{count?}" multipleQueries
+            route "/updates/{count?}" multipleUpdates
+        |]
+
+
+module Main =
+    open SpanJson
+    open Microsoft.AspNetCore.Http
+    open Microsoft.AspNetCore.Builder
+    open Microsoft.AspNetCore.Hosting
+    open Microsoft.Extensions.DependencyInjection
+    open Microsoft.Extensions.Hosting
+    open Microsoft.Extensions.Logging
+    open System.Buffers
+
+    type SpanJsonSerializer() =
+        interface Serializers.IJsonSerializer with
+            member this.Serialize(value, ctx, chunked) =
+                ctx.Response.ContentType <- "application/json"
+                if chunked then
+                    if ctx.Request.Method <> HttpMethods.Head then
+                        JsonSerializer.Generic.Utf8.SerializeAsync<_>(value, stream = ctx.Response.Body).AsTask()
+                    else
+                        Task.CompletedTask
+                else
+                    task {
+                        let buffer = JsonSerializer.Generic.Utf8.SerializeToArrayPool<_>(value)
+                        ctx.Response.Headers.ContentLength <- buffer.Count
+                        if ctx.Request.Method <> HttpMethods.Head then
+                            do! ctx.Response.Body.WriteAsync(buffer)
+                            ArrayPool<byte>.Shared.Return(buffer.Array)
+                        else
+                            return ()
+                    }
+            member this.Deserialize _ =
+                failwith "Not implemented"
+
+    [<EntryPoint>]
+    let main args =
+        let builder = WebApplication.CreateBuilder(args)
+        builder.Services
+            .AddRouting()
+            .AddOxpecker()
+            .AddSingleton<Serializers.IJsonSerializer>(SpanJsonSerializer())
+        |> ignore
+        builder.Logging.ClearProviders() |> ignore
+        let app = builder.Build()
+        app.UseRouting()
+           .UseOxpecker HttpHandlers.endpoints |> ignore
+        app.Run()
+        0

+ 3 - 3
frameworks/FSharp/zebra/src/App/App.fsproj

@@ -9,10 +9,10 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="Dapper" Version="2.1.21" />
-    <PackageReference Include="Npgsql" Version="8.0.0-rc.2" />
+    <PackageReference Include="Dapper" Version="2.1.44" />
+    <PackageReference Include="Npgsql" Version="8.0.3" />
     <PackageReference Include="Utf8Json" Version="1.3.7" />
-    <PackageReference Update="FSharp.Core" Version="8.0.100" />
+    <PackageReference Update="FSharp.Core" Version="8.0.200" />
   </ItemGroup>
 
   <ItemGroup>

+ 1 - 1
frameworks/FSharp/zebra/zebra-simple.dockerfile

@@ -1,4 +1,4 @@
-FROM mcr.microsoft.com/dotnet/sdk:8.0.100 AS build
+FROM mcr.microsoft.com/dotnet/sdk:8.0.204 AS build
 WORKDIR /app
 COPY src/App .
 RUN dotnet publish -c Release -o out

+ 1 - 1
frameworks/FSharp/zebra/zebra.dockerfile

@@ -1,4 +1,4 @@
-FROM mcr.microsoft.com/dotnet/sdk:8.0.100 AS build
+FROM mcr.microsoft.com/dotnet/sdk:8.0.204 AS build
 WORKDIR /app
 COPY src/App .
 RUN dotnet publish -c Release -o out

+ 3 - 3
frameworks/Go/aah/src/benchmark/go.mod

@@ -22,10 +22,10 @@ require (
 	github.com/satori/go.uuid v1.2.0 // indirect
 	github.com/shopspring/decimal v1.3.1 // indirect
 	github.com/urfave/cli v1.20.0 // indirect
-	golang.org/x/crypto v0.17.0 // indirect
-	golang.org/x/net v0.17.0 // indirect
+	golang.org/x/crypto v0.21.0 // indirect
+	golang.org/x/net v0.23.0 // indirect
 	golang.org/x/oauth2 v0.0.0-20181003184128-c57b0facaced // indirect
-	golang.org/x/sys v0.15.0 // indirect
+	golang.org/x/sys v0.18.0 // indirect
 	golang.org/x/text v0.14.0 // indirect
 	google.golang.org/appengine v1.6.7 // indirect
 	gopkg.in/go-playground/assert.v1 v1.2.1 // indirect

+ 6 - 6
frameworks/Go/aah/src/benchmark/go.sum

@@ -42,17 +42,17 @@ github.com/urfave/cli v1.20.0 h1:fDqGv3UG/4jbVl/QkFwEdddtEDjh/5Ov6X+0B/3bPaw=
 github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
 golang.org/x/crypto v0.0.0-20181012144002-a92615f3c490/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
-golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k=
-golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
+golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA=
+golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
 golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
-golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM=
-golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
+golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs=
+golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
 golang.org/x/oauth2 v0.0.0-20181003184128-c57b0facaced h1:4oqSq7eft7MdPKBGQK11X9WYUxmj6ZLgGTqYIbY1kyw=
 golang.org/x/oauth2 v0.0.0-20181003184128-c57b0facaced/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc=
-golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4=
+golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
 golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=

+ 3 - 3
frameworks/Go/echo/src/go.mod

@@ -13,8 +13,8 @@ require (
 	github.com/mattn/go-isatty v0.0.16 // indirect
 	github.com/valyala/bytebufferpool v1.0.0 // indirect
 	github.com/valyala/fasttemplate v1.2.1 // indirect
-	golang.org/x/crypto v0.17.0 // indirect
-	golang.org/x/net v0.17.0 // indirect
-	golang.org/x/sys v0.15.0 // indirect
+	golang.org/x/crypto v0.21.0 // indirect
+	golang.org/x/net v0.23.0 // indirect
+	golang.org/x/sys v0.18.0 // indirect
 	golang.org/x/text v0.14.0 // indirect
 )

+ 6 - 6
frameworks/Go/echo/src/go.sum

@@ -22,16 +22,16 @@ github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6Kllzaw
 github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
 github.com/valyala/fasttemplate v1.2.1 h1:TVEnxayobAdVkhQfrfes2IzOB6o+z4roRkPF52WA1u4=
 github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ=
-golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k=
-golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
-golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM=
-golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
+golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA=
+golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
+golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs=
+golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
 golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc=
-golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4=
+golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
 golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=

+ 3 - 3
frameworks/Go/gin/gin-gorm/go.mod

@@ -42,9 +42,9 @@ require (
 	github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
 	github.com/ugorji/go/codec v1.2.11 // indirect
 	golang.org/x/arch v0.3.0 // indirect
-	golang.org/x/crypto v0.20.0 // indirect
-	golang.org/x/net v0.21.0 // indirect
-	golang.org/x/sys v0.17.0 // indirect
+	golang.org/x/crypto v0.21.0 // indirect
+	golang.org/x/net v0.23.0 // indirect
+	golang.org/x/sys v0.18.0 // indirect
 	golang.org/x/text v0.14.0 // indirect
 	google.golang.org/protobuf v1.33.0 // indirect
 	gopkg.in/yaml.v3 v3.0.1 // indirect

+ 6 - 6
frameworks/Go/gin/gin-gorm/go.sum

@@ -194,8 +194,8 @@ golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWP
 golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
-golang.org/x/crypto v0.20.0 h1:jmAMJJZXr5KiCw05dfYK9QnqaqKLYXijU23lsEdcQqg=
-golang.org/x/crypto v0.20.0/go.mod h1:Xwo95rrVNIoSMx9wa1JroENMToLWn3RNVrTBpLHgZPQ=
+golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA=
+golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
 golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
 golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
 golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
@@ -205,8 +205,8 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL
 golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
 golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4=
-golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
+golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs=
+golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
 golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -223,8 +223,8 @@ golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7w
 golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y=
-golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4=
+golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=

+ 3 - 3
frameworks/Go/gin/gin-src/go.mod

@@ -26,9 +26,9 @@ require (
 	github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
 	github.com/ugorji/go/codec v1.2.11 // indirect
 	golang.org/x/arch v0.3.0 // indirect
-	golang.org/x/crypto v0.17.0 // indirect
-	golang.org/x/net v0.17.0 // indirect
-	golang.org/x/sys v0.15.0 // indirect
+	golang.org/x/crypto v0.21.0 // indirect
+	golang.org/x/net v0.23.0 // indirect
+	golang.org/x/sys v0.18.0 // indirect
 	golang.org/x/text v0.14.0 // indirect
 	google.golang.org/protobuf v1.33.0 // indirect
 	gopkg.in/yaml.v3 v3.0.1 // indirect

+ 6 - 6
frameworks/Go/gin/gin-src/go.sum

@@ -62,14 +62,14 @@ github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZ
 golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
 golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k=
 golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
-golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k=
-golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
-golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM=
-golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
+golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA=
+golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
+golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs=
+golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
 golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc=
-golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4=
+golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
 golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=

+ 3 - 3
frameworks/Go/gin/gin-std/go.mod

@@ -27,9 +27,9 @@ require (
 	github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
 	github.com/ugorji/go/codec v1.2.11 // indirect
 	golang.org/x/arch v0.3.0 // indirect
-	golang.org/x/crypto v0.17.0 // indirect
-	golang.org/x/net v0.17.0 // indirect
-	golang.org/x/sys v0.15.0 // indirect
+	golang.org/x/crypto v0.21.0 // indirect
+	golang.org/x/net v0.23.0 // indirect
+	golang.org/x/sys v0.18.0 // indirect
 	golang.org/x/text v0.14.0 // indirect
 	google.golang.org/protobuf v1.33.0 // indirect
 	gopkg.in/yaml.v3 v3.0.1 // indirect

+ 6 - 6
frameworks/Go/gin/gin-std/go.sum

@@ -63,14 +63,14 @@ github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZ
 golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
 golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k=
 golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
-golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k=
-golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
-golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM=
-golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
+golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA=
+golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
+golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs=
+golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
 golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc=
-golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4=
+golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
 golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
 google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=

+ 3 - 3
frameworks/Go/goframe/src/go.mod

@@ -42,9 +42,9 @@ require (
 	go.opentelemetry.io/otel/sdk v1.7.0 // indirect
 	go.opentelemetry.io/otel/trace v1.7.0 // indirect
 	golang.org/x/arch v0.0.0-20210923205945-b76863e36670 // indirect
-	golang.org/x/crypto v0.20.0 // indirect
-	golang.org/x/net v0.21.0 // indirect
-	golang.org/x/sys v0.17.0 // indirect
+	golang.org/x/crypto v0.21.0 // indirect
+	golang.org/x/net v0.23.0 // indirect
+	golang.org/x/sys v0.18.0 // indirect
 	golang.org/x/text v0.14.0 // indirect
 	gopkg.in/yaml.v3 v3.0.1 // indirect
 )

+ 6 - 6
frameworks/Go/goframe/src/go.sum

@@ -248,8 +248,8 @@ golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWP
 golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8=
 golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
-golang.org/x/crypto v0.20.0 h1:jmAMJJZXr5KiCw05dfYK9QnqaqKLYXijU23lsEdcQqg=
-golang.org/x/crypto v0.20.0/go.mod h1:Xwo95rrVNIoSMx9wa1JroENMToLWn3RNVrTBpLHgZPQ=
+golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA=
+golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
 golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
 golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
 golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
@@ -267,8 +267,8 @@ golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT
 golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4=
-golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
+golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs=
+golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
 golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -300,8 +300,8 @@ golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBc
 golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y=
-golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4=
+golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=

+ 1 - 1
frameworks/Go/kami/src/go.mod

@@ -5,7 +5,7 @@ go 1.19
 require (
 	github.com/go-sql-driver/mysql v1.6.0
 	github.com/guregu/kami v2.2.1+incompatible
-	golang.org/x/net v0.17.0
+	golang.org/x/net v0.23.0
 )
 
 require (

+ 2 - 2
frameworks/Go/kami/src/go.sum

@@ -10,8 +10,8 @@ github.com/zenazn/goji v1.0.1 h1:4lbD8Mx2h7IvloP7r2C0D6ltZP6Ufip8Hn0wmSK5LR8=
 github.com/zenazn/goji v1.0.1/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q=
 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
-golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM=
-golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
+golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs=
+golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=

+ 2 - 2
frameworks/Go/ronykit/src/go.mod

@@ -27,7 +27,7 @@ require (
 	github.com/valyala/bytebufferpool v1.0.0 // indirect
 	github.com/valyala/fasthttp v1.50.0 // indirect
 	github.com/valyala/tcplisten v1.0.0 // indirect
-	golang.org/x/net v0.17.0 // indirect
-	golang.org/x/sys v0.13.0 // indirect
+	golang.org/x/net v0.23.0 // indirect
+	golang.org/x/sys v0.18.0 // indirect
 	gopkg.in/yaml.v3 v3.0.1 // indirect
 )

+ 5 - 5
frameworks/Go/ronykit/src/go.sum

@@ -62,13 +62,13 @@ github.com/valyala/fasthttp v1.50.0 h1:H7fweIlBm0rXLs2q0XbalvJ6r0CUPFWK3/bB4N13e
 github.com/valyala/fasthttp v1.50.0/go.mod h1:k2zXd82h/7UZc3VOdJ2WaUqt1uZ/XpXAfE9i+HBC3lA=
 github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8=
 github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc=
-golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM=
-golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
+golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs=
+golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
 golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE=
-golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k=
+golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4=
+golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
 golang.org/x/tools v0.12.0 h1:YW6HUoUmYBpwSgyaGaZq1fHjrBjX1rlpZ54T6mu2kss=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=

+ 3 - 4
frameworks/Java/helidon/helidon-nima.dockerfile

@@ -1,17 +1,16 @@
-FROM docker.io/maven:3.9.2-eclipse-temurin-20 as maven
+FROM docker.io/maven:3.9.6-eclipse-temurin-21 as maven
 WORKDIR /helidon
 COPY nima/src src
 COPY nima/pom.xml pom.xml
 RUN mvn package -q
 
-FROM openjdk:20-jdk-slim
+FROM openjdk:22-rc-jdk-slim
 WORKDIR /helidon
 COPY --from=maven /helidon/target/libs libs
 COPY --from=maven /helidon/target/benchmark-nima.jar app.jar
 
 EXPOSE 8080
 
-CMD java --enable-preview \
-    -XX:+UseNUMA \
+CMD java -XX:+UseNUMA \
     -XX:+UseParallelGC \
     -jar app.jar

+ 9 - 10
frameworks/Java/helidon/nima/pom.xml

@@ -21,7 +21,7 @@
     <parent>
         <groupId>io.helidon.applications</groupId>
         <artifactId>helidon-se</artifactId>
-        <version>4.0.0-ALPHA6</version>
+        <version>4.0.3</version>
         <relativePath/>
     </parent>
 
@@ -33,25 +33,25 @@
 
     <properties>
         <mainClass>io.helidon.benchmark.nima.Main</mainClass>
-        <version.java>20</version.java>
+        <version.java>21</version.java>
         <version.plugin.compiler>3.11.0</version.plugin.compiler>
         <rocker.version>1.3.0</rocker.version>
-        <vertx-pg-client.version>4.4.2</vertx-pg-client.version>
+        <vertx-pg-client.version>4.5.3</vertx-pg-client.version>
         <jsoniter.version>0.9.23</jsoniter.version>
     </properties>
 
     <dependencies>
         <dependency>
-            <groupId>io.helidon.nima.webserver</groupId>
-            <artifactId>helidon-nima-webserver</artifactId>
+            <groupId>io.helidon.webserver</groupId>
+            <artifactId>helidon-webserver</artifactId>
         </dependency>
         <dependency>
             <groupId>io.helidon.config</groupId>
             <artifactId>helidon-config-yaml</artifactId>
         </dependency>
         <dependency>
-            <groupId>io.helidon.nima.http.media</groupId>
-            <artifactId>helidon-nima-http-media-jsonp</artifactId>
+            <groupId>io.helidon.http.media</groupId>
+            <artifactId>helidon-http-media-jsonp</artifactId>
         </dependency>
         <dependency>
             <groupId>io.helidon.common</groupId>
@@ -83,8 +83,8 @@
             <version>${rocker.version}</version>
         </dependency>
         <dependency>
-            <groupId>io.helidon.nima.testing.junit5</groupId>
-            <artifactId>helidon-nima-testing-junit5-webserver</artifactId>
+            <groupId>io.helidon.common.testing</groupId>
+            <artifactId>helidon-common-testing-junit5</artifactId>
             <scope>test</scope>
         </dependency>
         <dependency>
@@ -113,7 +113,6 @@
                     <compilerArgs>
                         <arg>-Xlint:unchecked</arg>
                         <arg>-Xpkginfo:always</arg>
-                        <arg>--enable-preview</arg>
                     </compilerArgs>
                 </configuration>
             </plugin>

+ 19 - 17
frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/Main.java

@@ -29,18 +29,17 @@ import io.helidon.benchmark.nima.models.HikariJdbcRepository;
 import io.helidon.benchmark.nima.models.PgClientRepository;
 import io.helidon.benchmark.nima.services.DbService;
 import io.helidon.benchmark.nima.services.FortuneHandler;
-import io.helidon.common.http.Http;
-import io.helidon.common.http.Http.Header;
-import io.helidon.common.http.Http.HeaderValue;
-import io.helidon.common.http.Http.HeaderValues;
+import io.helidon.http.Header;
+import io.helidon.http.HeaderNames;
+import io.helidon.http.HeaderValues;
 import io.helidon.config.Config;
 import io.helidon.config.ConfigException;
 import io.helidon.logging.common.LogConfig;
-import io.helidon.nima.webserver.WebServer;
-import io.helidon.nima.webserver.http.Handler;
-import io.helidon.nima.webserver.http.HttpRules;
-import io.helidon.nima.webserver.http.ServerRequest;
-import io.helidon.nima.webserver.http.ServerResponse;
+import io.helidon.webserver.WebServer;
+import io.helidon.webserver.http.Handler;
+import io.helidon.webserver.http.HttpRules;
+import io.helidon.webserver.http.ServerRequest;
+import io.helidon.webserver.http.ServerResponse;
 
 /**
  * Main class of the benchmark.
@@ -50,9 +49,9 @@ import io.helidon.nima.webserver.http.ServerResponse;
 public final class Main {
     private static final Logger LOGGER = Logger.getLogger(Main.class.getName());
 
-    public static final Http.HeaderValue CONTENT_TYPE_HTML =
-            Http.Header.createCached(Http.Header.CONTENT_TYPE, "text/html; charset=UTF-8");
-    public static final Http.HeaderValue SERVER = Http.Header.createCached(Http.Header.SERVER, "Nima");
+    public static final Header CONTENT_TYPE_HTML =
+            HeaderValues.createCached(HeaderNames.CONTENT_TYPE, "text/html; charset=UTF-8");
+    public static final Header SERVER = HeaderValues.createCached(HeaderNames.SERVER, "Nima");
 
     private Main() {
     }
@@ -67,11 +66,14 @@ public final class Main {
         LogConfig.configureRuntime();
 
         WebServer.builder()
+                .config(Config.create().get("server"))
                 .routing(Main::routing)
+                .build()
                 .start();
     }
 
     // exposed for tests
+    @SuppressWarnings("unchecked")
     static void routing(HttpRules rules) {
         Config config = Config.create();
 
@@ -107,9 +109,9 @@ public final class Main {
     }
 
     static class PlaintextHandler implements Handler {
-        static final HeaderValue CONTENT_TYPE = Header.createCached(Header.CONTENT_TYPE,
+        static final Header CONTENT_TYPE = HeaderValues.createCached(HeaderNames.CONTENT_TYPE,
                 "text/plain; charset=UTF-8");
-        static final HeaderValue CONTENT_LENGTH = Header.createCached(Header.CONTENT_LENGTH, "13");
+        static final Header CONTENT_LENGTH = HeaderValues.createCached(HeaderNames.CONTENT_LENGTH, "13");
 
         private static final byte[] RESPONSE_BYTES = "Hello, World!".getBytes(StandardCharsets.UTF_8);
 
@@ -125,7 +127,7 @@ public final class Main {
     static class JsonHandler implements Handler {
         private static final String MESSAGE = "Hello, World!";
         private static final int JSON_LENGTH = serializeMsg(new Message(MESSAGE)).length;
-        static final HeaderValue CONTENT_LENGTH = Header.createCached(Header.CONTENT_LENGTH,
+        static final Header CONTENT_LENGTH = HeaderValues.createCached(HeaderNames.CONTENT_LENGTH,
                 String.valueOf(JSON_LENGTH));
 
         @Override
@@ -142,13 +144,13 @@ public final class Main {
     }
 
     static class JsonKHandler implements Handler {
-        private final HeaderValue contentLength;
+        private final Header contentLength;
         private final String message;
 
         JsonKHandler(int kilobytes) {
             this.message = "a".repeat(1024 * kilobytes);
             int length = serializeMsg(new Message(message)).length;
-            this.contentLength = Header.createCached(Header.CONTENT_LENGTH,
+            this.contentLength = HeaderValues.createCached(HeaderNames.CONTENT_LENGTH,
                     String.valueOf(length));
         }
 

+ 23 - 18
frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/models/PgClientRepository.java

@@ -110,29 +110,34 @@ public class PgClientRepository implements DbRepository {
 
     @Override
     public World updateWorld(World world) {
-        try {
-            updateWorlds(List.of(world), 0, updatePool);
-            return world;
-        } catch (Exception e) {
-            throw new RuntimeException(e);
-        }
+        return Single.create(queryPool.preparedQuery("UPDATE world SET randomnumber = $1 WHERE id = $2")
+                .execute(Tuple.of(world.id, world.id))
+                .toCompletionStage()
+                .thenApply(rows -> world)).await();
     }
 
     @Override
     public List<World> updateWorlds(int count) {
         List<World> worlds = getWorlds(count);
-        for (World w : worlds) {
-            w.randomNumber = randomWorldNumber();
-        }
-        if (count <= batchSize) {
-            LOGGER.finest(() -> "Updating single batch of size " + count);
-            updateWorldsRetry(worlds, 0, 0);
-        } else {
-            int batches = count / batchSize + (count % batchSize == 0 ? 0 : 1);
-            for (int i = 0; i < batches; i++) {
-                final int from = i * batchSize;
-                LOGGER.finest(() -> "Updating batch from " + from + " to " + (from + batchSize));
-                updateWorldsRetry(worlds, from, 0);
+        if (batchSize > 1) {        // batching updates
+            for (World w : worlds) {
+                w.randomNumber = randomWorldNumber();
+            }
+            if (count <= batchSize) {
+                LOGGER.finest(() -> "Updating single batch of size " + count);
+                updateWorldsRetry(worlds, 0, 0);
+            } else {
+                int batches = count / batchSize + (count % batchSize == 0 ? 0 : 1);
+                for (int i = 0; i < batches; i++) {
+                    final int from = i * batchSize;
+                    LOGGER.finest(() -> "Updating batch from " + from + " to " + (from + batchSize));
+                    updateWorldsRetry(worlds, from, 0);
+                }
+            }
+        } else {                    // no batching for size 1
+            for (World w : worlds) {
+                w.randomNumber = randomWorldNumber();
+                updateWorld(w);
             }
         }
         return worlds;

+ 4 - 4
frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/services/DbService.java

@@ -7,10 +7,10 @@ import java.util.List;
 import io.helidon.benchmark.nima.models.DbRepository;
 import io.helidon.benchmark.nima.models.World;
 import io.helidon.common.parameters.Parameters;
-import io.helidon.nima.webserver.http.HttpRules;
-import io.helidon.nima.webserver.http.HttpService;
-import io.helidon.nima.webserver.http.ServerRequest;
-import io.helidon.nima.webserver.http.ServerResponse;
+import io.helidon.webserver.http.HttpRules;
+import io.helidon.webserver.http.HttpService;
+import io.helidon.webserver.http.ServerRequest;
+import io.helidon.webserver.http.ServerResponse;
 
 import jakarta.json.Json;
 import jakarta.json.JsonArrayBuilder;

+ 3 - 3
frameworks/Java/helidon/nima/src/main/java/io/helidon/benchmark/nima/services/FortuneHandler.java

@@ -7,9 +7,9 @@ import java.util.List;
 import com.fizzed.rocker.runtime.ArrayOfByteArraysOutput;
 import io.helidon.benchmark.nima.models.DbRepository;
 import io.helidon.benchmark.nima.models.Fortune;
-import io.helidon.nima.webserver.http.Handler;
-import io.helidon.nima.webserver.http.ServerRequest;
-import io.helidon.nima.webserver.http.ServerResponse;
+import io.helidon.webserver.http.Handler;
+import io.helidon.webserver.http.ServerRequest;
+import io.helidon.webserver.http.ServerResponse;
 import views.fortunes;
 
 import static io.helidon.benchmark.nima.Main.CONTENT_TYPE_HTML;

+ 12 - 18
frameworks/Java/helidon/nima/src/main/resources/application.yaml

@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2022, 2023 Oracle and/or its affiliates.
+# Copyright (c) 2022, 2024 Oracle and/or its affiliates.
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -15,33 +15,27 @@
 #
 
 server:
+  host: 0.0.0.0
   port: 8080
-  sockets:
-    - name: "@default"
-      host: 0.0.0.0
-      port: 8080
-      backlog: 8192
-      receive-buffer-size: 64000
-      # set write-queue-length to 0 or not setting it will disable async writes
-      # write-queue-length: 1024
-      connection-options:
-        read-timeout-seconds: 0
-        connect-timeout-seconds: 0
-        send-buffer-size: 64000
-        receive-buffer-size: 64000
-  connection-providers:
+  backlog: 8192
+  write-queue-length: 8192
+  connection-options:
+    read-timeout: PT0S
+    connect-timeout: PT0S
+    tcp-no-delay: true
+  protocols:
     "http_1_1":
-      validate-headers: false
+      validate-request-headers: false
+      validate-response-headers: false
       validate-path: false
       recv-log: false
       send-log: false
 
 host: "tfb-database"
-#host: "localhost"
 db: "hello_world"
 username: benchmarkdbuser
 password: benchmarkdbpass
-sql-pool-size: 200
+sql-pool-size: 300
 db-repository: "pgclient"     # "pgclient" (default) or "hikari"
 
 # The following for pgclient only

+ 3 - 2
frameworks/Java/inverno/inverno-postgres.dockerfile

@@ -7,6 +7,7 @@ RUN mvn package -q -Pio.inverno.io_uring
 
 EXPOSE 8080
 
-# CMD [ "target/inverno-benchmark-1.0.0-SNAPSHOT-application_linux_amd64/bin/inverno-benchmark" ]
 CMD export DBIP=`getent hosts tfb-database | awk '{ print $1 }'` && \
-    target/inverno-benchmark-1.0.0-SNAPSHOT-application_linux_amd64/bin/inverno-benchmark --com.techempower.inverno.benchmark.appConfiguration.db_host=\"$DBIP\"
+    target/inverno-benchmark-1.0.0-SNAPSHOT-application_linux_amd64/bin/inverno-benchmark \
+    --com.techempower.inverno.benchmark.appConfiguration.db_host=\"$DBIP\" \
+    --com.techempower.inverno.benchmark.appConfiguration.boot.reactor_event_loop_group_size=$((`grep --count ^processor /proc/cpuinfo`))

+ 17 - 25
frameworks/Java/inverno/pom.xml

@@ -6,7 +6,7 @@
 	<parent>
 		<groupId>io.inverno.dist</groupId>
 		<artifactId>inverno-parent</artifactId>
-		<version>1.7.0</version>
+		<version>1.10.0</version>
 	</parent>
 	<groupId>com.techempower</groupId>
 	<artifactId>inverno-benchmark</artifactId>
@@ -47,7 +47,7 @@
 			<groupId>io.inverno.mod</groupId>
 			<artifactId>inverno-sql-vertx</artifactId>
 		</dependency>
-		
+
 		<dependency>
 			<groupId>org.unbescape</groupId>
 			<artifactId>unbescape</artifactId>
@@ -71,31 +71,12 @@
 		<dependency>
 			<groupId>io.netty</groupId>
 			<artifactId>netty-handler-proxy</artifactId>
-			<version>${version.netty}</version>
 		</dependency>
 		<dependency>
 			<groupId>io.netty</groupId>
 			<artifactId>netty-resolver-dns</artifactId>
-			<version>${version.netty}</version>
 		</dependency>
 
-		<!--<dependency>
-			<groupId>io.netty</groupId>
-			<artifactId>netty-transport-native-epoll</artifactId>
-			<classifier>linux-x86_64</classifier>
-		</dependency>-->
-		
-		<dependency>
-			<groupId>io.netty.incubator</groupId>
-			<artifactId>netty-incubator-transport-native-io_uring</artifactId>
-			<classifier>linux-x86_64</classifier>
-		</dependency>
-		
-		<dependency>
-			<groupId>io.vertx</groupId>
-			<artifactId>vertx-io_uring-incubator</artifactId>
-		</dependency>
-		
 		<dependency>
 			<groupId>org.apache.logging.log4j</groupId>
 			<artifactId>log4j-core</artifactId>
@@ -129,7 +110,7 @@
 									<launchers>
 										<launcher>
 											<name>inverno-benchmark</name>
-											<vmOptions>-Xms2g -Xmx2g -server -XX:+UseNUMA -XX:+UseParallelGC -Dio.netty.leakDetection.level=disabled -Dio.netty.buffer.checkBounds=false -Dio.netty.buffer.checkBounds=false -Dvertx.disableHttpHeadersValidation=true -Dvertx.disableMetrics=true -Dvertx.disableH2c=true -Dvertx.disableWebsockets=true -Dvertx.flashPolicyHandler=false -Dvertx.threadChecks=false -Dvertx.disableContextTimings=true -Dvertx.disableTCCL=true --add-modules io.netty.transport.unix.common,io.netty.transport.classes.epoll,io.netty.transport.epoll.linux.x86_64</vmOptions>
+											<vmOptions>-Xms2g -Xmx2g -server -XX:+UseNUMA -XX:+UseParallelGC -Dlog4j2.level=OFF -Dio.netty.leakDetection.level=disabled -Dio.netty.buffer.checkBounds=false -Dio.netty.buffer.checkAccessible=false -Dvertx.disableHttpHeadersValidation=true -Dvertx.disableMetrics=true -Dvertx.disableH2c=true -Dvertx.disableWebsockets=true -Dvertx.flashPolicyHandler=false -Dvertx.threadChecks=false -Dvertx.disableContextTimings=true -Dvertx.disableTCCL=true --add-modules io.netty.transport.unix.common,io.netty.transport.classes.epoll,io.netty.transport.epoll.linux.x86_64</vmOptions>
 										</launcher>
 									</launchers>
 									<archiveFormats>
@@ -138,6 +119,9 @@
 								</configuration>
 							</execution>
 						</executions>
+						<configuration>
+							<vmOptions>--add-modules io.netty.transport.unix.common,io.netty.transport.classes.epoll,io.netty.transport.epoll.linux.x86_64</vmOptions>
+						</configuration>
 					</plugin>
 				</plugins>
 			</build>
@@ -146,10 +130,15 @@
 			<id>io.inverno.io_uring</id>
 			<dependencies>
 				<dependency>
-					<groupId>io.netty</groupId>
-					<artifactId>netty-transport-native-epoll</artifactId>
+					<groupId>io.netty.incubator</groupId>
+					<artifactId>netty-incubator-transport-native-io_uring</artifactId>
 					<classifier>linux-x86_64</classifier>
 				</dependency>
+		
+				<dependency>
+					<groupId>io.vertx</groupId>
+					<artifactId>vertx-io_uring-incubator</artifactId>
+				</dependency>
 			</dependencies>
 			<build>
 				<plugins>
@@ -168,7 +157,7 @@
 									<launchers>
 										<launcher>
 											<name>inverno-benchmark</name>
-											<vmOptions>-Xms2g -Xmx2g -server -XX:+UseNUMA -XX:+UseParallelGC -Dio.netty.leakDetection.level=disabled -Dio.netty.buffer.checkBounds=false -Dio.netty.buffer.checkBounds=false -Dvertx.disableHttpHeadersValidation=true -Dvertx.disableMetrics=true -Dvertx.disableH2c=true -Dvertx.disableWebsockets=true -Dvertx.flashPolicyHandler=false -Dvertx.threadChecks=false -Dvertx.disableContextTimings=true -Dvertx.disableTCCL=true --add-modules io.netty.transport.unix.common,io.netty.incubator.transport.classes.io_uring,io.netty.incubator.transport.io_uring.linux.x86_64</vmOptions>
+											<vmOptions>-Xms2g -Xmx2g -server -XX:+UseNUMA -XX:+UseParallelGC -Dlog4j2.level=OFF -Dio.netty.leakDetection.level=disabled -Dio.netty.buffer.checkBounds=false -Dio.netty.buffer.checkAccessible=false -Dvertx.disableHttpHeadersValidation=true -Dvertx.disableMetrics=true -Dvertx.disableH2c=true -Dvertx.disableWebsockets=true -Dvertx.flashPolicyHandler=false -Dvertx.threadChecks=false -Dvertx.disableContextTimings=true -Dvertx.disableTCCL=true --add-modules io.netty.transport.unix.common,io.netty.incubator.transport.classes.io_uring,io.netty.incubator.transport.io_uring.linux.x86_64</vmOptions>
 										</launcher>
 									</launchers>
 									<archiveFormats>
@@ -177,6 +166,9 @@
 								</configuration>
 							</execution>
 						</executions>
+						<configuration>
+							<vmOptions>--add-modules io.netty.transport.unix.common,io.netty.incubator.transport.classes.io_uring,io.netty.incubator.transport.io_uring.linux.x86_64</vmOptions>
+						</configuration>
 					</plugin>
 				</plugins>
 			</build>

+ 15 - 15
frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/internal/Controller.java

@@ -1,20 +1,11 @@
 package com.techempower.inverno.benchmark.internal;
 
-import java.time.ZonedDateTime;
-import java.time.format.DateTimeFormatter;
-import java.util.Collections;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.ThreadLocalRandom;
-import java.util.concurrent.TimeUnit;
-import java.util.function.Supplier;
-
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.techempower.inverno.benchmark.model.Fortune;
 import com.techempower.inverno.benchmark.model.Message;
 import com.techempower.inverno.benchmark.model.World;
 import com.techempower.inverno.benchmark.templates.FortunesTemplate;
-
 import io.inverno.core.annotation.Bean;
 import io.inverno.core.annotation.Bean.Visibility;
 import io.inverno.core.annotation.Destroy;
@@ -39,6 +30,13 @@ import io.netty.channel.EventLoopGroup;
 import io.netty.handler.codec.http.HttpHeaderNames;
 import io.netty.handler.codec.http.HttpHeaderValues;
 import io.netty.util.AsciiString;
+import java.time.ZonedDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Collections;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ThreadLocalRandom;
+import java.util.concurrent.TimeUnit;
+import java.util.function.Supplier;
 import reactor.core.publisher.Flux;
 import reactor.core.publisher.Mono;
 
@@ -81,6 +79,8 @@ public class Controller implements ServerController<ExchangeContext, Exchange<Ex
 		this.dateEventLoopGroup.scheduleAtFixedRate(() -> {
 			this.date = new AsciiString(DateTimeFormatter.RFC_1123_DATE_TIME.format(ZonedDateTime.now()));
 		}, 0, 1000, TimeUnit.MILLISECONDS);
+		
+		
 	}
 	
 	@Destroy
@@ -133,7 +133,7 @@ public class Controller implements ServerController<ExchangeContext, Exchange<Ex
 
 	private static final ByteBuf STATIC_PLAINTEXT_BYTEBUF;
 	static {
-		ByteBuf tmpBuf = Unpooled.directBuffer(STATIC_PLAINTEXT_LEN);
+		ByteBuf tmpBuf = Unpooled.buffer(STATIC_PLAINTEXT_LEN);
 		tmpBuf.writeBytes(STATIC_PLAINTEXT);
 		STATIC_PLAINTEXT_BYTEBUF = Unpooled.unreleasableBuffer(tmpBuf);
 	}
@@ -172,7 +172,7 @@ public class Controller implements ServerController<ExchangeContext, Exchange<Ex
 				)
 				.body()
 					.raw()
-						.value(Unpooled.unreleasableBuffer(Unpooled.wrappedBuffer(this.mapper.writeValueAsBytes(new Message("Hello, World!")))));
+						.value(Unpooled.wrappedBuffer(this.mapper.writeValueAsBytes(new Message("Hello, World!"))));
 		} 
 		catch (JsonProcessingException | IllegalStateException e) {
 			throw new InternalServerErrorException("Error serializing message as JSON", e);
@@ -196,7 +196,7 @@ public class Controller implements ServerController<ExchangeContext, Exchange<Ex
 						DB_SELECT_WORLD, 
 						row -> {
 							try {
-								return Unpooled.unreleasableBuffer(Unpooled.wrappedBuffer(this.mapper.writeValueAsBytes(new World(row.getInteger(0), row.getInteger(1)))));
+								return Unpooled.wrappedBuffer(this.mapper.writeValueAsBytes(new World(row.getInteger(0), row.getInteger(1))));
 							} 
 							catch (JsonProcessingException e) {
 								throw new InternalServerErrorException(e);
@@ -241,7 +241,7 @@ public class Controller implements ServerController<ExchangeContext, Exchange<Ex
 					.collectList()
 					.map(worlds -> {
 						try {
-							return Unpooled.unreleasableBuffer(Unpooled.wrappedBuffer(this.mapper.writeValueAsBytes(worlds)));
+							return Unpooled.wrappedBuffer(this.mapper.writeValueAsBytes(worlds));
 						} 
 						catch (JsonProcessingException e) {
 							throw new InternalServerErrorException(e);
@@ -278,7 +278,7 @@ public class Controller implements ServerController<ExchangeContext, Exchange<Ex
 					)
 					.map(worlds -> {
 						try {
-							return Unpooled.unreleasableBuffer(Unpooled.wrappedBuffer(this.mapper.writeValueAsBytes(worlds)));
+							return Unpooled.wrappedBuffer(this.mapper.writeValueAsBytes(worlds));
 						} 
 						catch (JsonProcessingException e) {
 							throw new InternalServerErrorException(e);
@@ -290,7 +290,7 @@ public class Controller implements ServerController<ExchangeContext, Exchange<Ex
 	
 	private static final CharSequence MEDIA_TEXT_HTML_UTF8 = AsciiString.cached("text/html; charset=utf-8");
 	
-	private static final FortunesTemplate.Renderer<CompletableFuture<ByteBuf>> FORTUNES_RENDERER = FortunesTemplate.bytebuf(() -> Unpooled.unreleasableBuffer(Unpooled.buffer()));
+	private static final FortunesTemplate.Renderer<CompletableFuture<ByteBuf>> FORTUNES_RENDERER = FortunesTemplate.bytebuf(() -> Unpooled.buffer());
 	
 	public void handle_fortunes(Exchange<ExchangeContext> exchange) throws HttpException {
 		exchange.response()

+ 3 - 1
frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/internal/SqlClientReactorScope.java

@@ -59,6 +59,8 @@ public class SqlClientReactorScope extends ReactorScope<Mono<SqlClient>> {
 	
 	@Override
 	protected Mono<SqlClient> create() {
-		return Mono.fromCompletionStage(PgConnection.connect(this.vertx, this.connectOptions).toCompletionStage()).map(pgConn -> (SqlClient)new ConnectionSqlClient(pgConn)).cache();
+		return Mono.fromCompletionStage(() -> PgConnection.connect(this.vertx, this.connectOptions).toCompletionStage())
+			.map(pgConn -> (SqlClient)new ConnectionSqlClient(pgConn))
+			.cacheInvalidateWhen(client -> ((ConnectionSqlClient)client).onClose());
 	}
 }

+ 3 - 1
frameworks/Java/inverno/src/main/resources/configuration.cprops

@@ -6,7 +6,9 @@ com.techempower.inverno.benchmark.appConfiguration {
 	http_server { 
 		tls_enabled = false
 		server_port = 8080
-		h2c_enabled = false
+		h2_enabled = false
+		http1x_validate_headers = false
+		ws_enabled = false
 	}
 	db_database = "hello_world"
 	db_host = "tfb-database"

+ 32 - 5
frameworks/Java/jooby/pom.xml

@@ -11,9 +11,10 @@
   <name>jooby</name>
 
   <properties>
-    <jooby.version>3.0.8</jooby.version>
+    <jooby.version>3.1.2</jooby.version>
+    <netty.version>4.1.110.Final</netty.version>
     <dsl-json.version>2.0.2</dsl-json.version>
-    <postgresql.version>42.7.2</postgresql.version>
+    <postgresql.version>42.7.3</postgresql.version>
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     <maven.compiler.source>21</maven.compiler.source>
     <maven.compiler.target>21</maven.compiler.target>
@@ -41,10 +42,9 @@
     <dependency>
       <groupId>com.mysql</groupId>
       <artifactId>mysql-connector-j</artifactId>
-      <version>8.3.0</version>
+      <version>8.4.0</version>
     </dependency>
 
-
     <!-- postgresql -->
     <dependency>
       <groupId>org.postgresql</groupId>
@@ -55,7 +55,7 @@
     <dependency>
       <groupId>io.vertx</groupId>
       <artifactId>vertx-pg-client</artifactId>
-      <version>4.5.4</version>
+      <version>4.5.7</version>
     </dependency>
 
     <!-- json -->
@@ -166,6 +166,25 @@
   </build>
 
   <profiles>
+    <profile>
+      <id>mac</id>
+      <activation>
+        <os>
+          <family>mac</family>
+        </os>
+      </activation>
+      <dependencies>
+        <dependency>
+          <groupId>com.ongres.scram</groupId>
+          <artifactId>client</artifactId>
+          <version>2.1</version>
+        </dependency>
+        <dependency>
+          <groupId>io.netty</groupId>
+          <artifactId>netty-resolver-dns-native-macos</artifactId>
+        </dependency>
+      </dependencies>
+    </profile>
     <profile>
       <id>undertow</id>
       <dependencies>
@@ -202,6 +221,14 @@
 
   <dependencyManagement>
     <dependencies>
+      <dependency>
+        <groupId>io.netty</groupId>
+        <artifactId>netty-bom</artifactId>
+        <version>${netty.version}</version>
+        <type>pom</type>
+        <scope>import</scope>
+      </dependency>
+
       <dependency>
         <groupId>io.jooby</groupId>
         <artifactId>jooby-bom</artifactId>

+ 1 - 1
frameworks/Java/jooby/src/main/java/com/techempower/App.java

@@ -40,7 +40,7 @@ public class App extends Jooby {
     DataSource ds = require(DataSource.class);
 
     /** Template engine: */
-    install(new RockerModule().reuseBuffer(true));
+    install(new RockerModule());
 
     get("/plaintext", ctx ->
         ctx.send(MESSAGE_BUFFER.duplicate())

+ 4 - 8
frameworks/Java/jooby/src/main/java/com/techempower/Json.java

@@ -19,8 +19,7 @@ public class Json {
   public static ByteBuffer encode(Message data) {
     JsonWriter writer = pool.get();
     writer.reset();
-    _Message_DslJsonConverter.ObjectFormatConverter converter = new _Message_DslJsonConverter.ObjectFormatConverter(
-        dslJson);
+    var converter = new _Message_DslJsonConverter.ObjectFormatConverter(dslJson);
     converter.write(writer, data);
     return ByteBuffer.wrap(writer.getByteBuffer(), 0, writer.size());
   }
@@ -28,8 +27,7 @@ public class Json {
   public static ByteBuffer encode(World data) {
     JsonWriter writer = pool.get();
     writer.reset();
-    _World_DslJsonConverter.ObjectFormatConverter converter = new _World_DslJsonConverter.ObjectFormatConverter(
-        dslJson);
+    var converter = new _World_DslJsonConverter.ObjectFormatConverter(dslJson);
     converter.write(writer, data);
     return ByteBuffer.wrap(writer.getByteBuffer(), 0, writer.size());
   }
@@ -37,8 +35,7 @@ public class Json {
   public static ByteBuffer encode(World[] data) {
     JsonWriter writer = pool.get();
     writer.reset();
-    _World_DslJsonConverter.ObjectFormatConverter converter = new _World_DslJsonConverter.ObjectFormatConverter(
-        dslJson);
+    var converter = new _World_DslJsonConverter.ObjectFormatConverter(dslJson);
     writer.serialize(data, converter);
     return ByteBuffer.wrap(writer.getByteBuffer(), 0, writer.size());
   }
@@ -46,8 +43,7 @@ public class Json {
   public static ByteBuffer encode(List<World> data) {
     JsonWriter writer = pool.get();
     writer.reset();
-    _World_DslJsonConverter.ObjectFormatConverter converter = new _World_DslJsonConverter.ObjectFormatConverter(
-        dslJson);
+    var converter = new _World_DslJsonConverter.ObjectFormatConverter(dslJson);
     writer.serialize(data, converter);
     return ByteBuffer.wrap(writer.getByteBuffer(), 0, writer.size());
   }

+ 4 - 7
frameworks/Java/jooby/src/main/java/com/techempower/ReactivePg.java

@@ -4,17 +4,14 @@ import static com.techempower.Util.randomWorld;
 import static io.jooby.ExecutionMode.EVENT_LOOP;
 import static io.jooby.MediaType.JSON;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
+import java.util.*;
 
 import com.fizzed.rocker.RockerOutputFactory;
 import io.jooby.Context;
 import io.jooby.Jooby;
 import io.jooby.MediaType;
 import io.jooby.ServerOptions;
-import io.jooby.rocker.ByteBufferOutput;
+import io.jooby.rocker.DataBufferOutput;
 import io.jooby.rocker.RockerModule;
 import io.vertx.sqlclient.Row;
 import io.vertx.sqlclient.RowIterator;
@@ -34,7 +31,7 @@ public class ReactivePg extends Jooby {
     PgClient client = new PgClient(getConfig().getConfig("db"));
 
     /** Template engine: */
-    install(new RockerModule().reuseBuffer(true));
+    install(new RockerModule());
 
     /** Single query: */
     get("/db", ctx -> {
@@ -109,7 +106,7 @@ public class ReactivePg extends Jooby {
     }).setNonBlocking(true);
 
     /** Fortunes: */
-    RockerOutputFactory<ByteBufferOutput> factory = require(RockerOutputFactory.class);
+    RockerOutputFactory<DataBufferOutput> factory = require(RockerOutputFactory.class);
     get("/fortunes", ctx -> {
       client.fortunes(rsp -> {
         if (rsp.succeeded()) {

+ 1 - 1
frameworks/Java/light-java/pom.xml

@@ -25,7 +25,7 @@
         <maven.compiler.target>11</maven.compiler.target>
         <version.light-4j>2.0.1</version.light-4j>
         <version.logback>1.3.12</version.logback>
-        <version.undertow>2.3.5.Final</version.undertow>
+        <version.undertow>2.3.12.Final</version.undertow>
         <version.hikaricp>3.3.1</version.hikaricp>
         <version.mysql>8.0.28</version.mysql>
         <version.postgres>42.7.2</version.postgres>

+ 24 - 24
frameworks/Java/micronaut/benchmark_config.json

@@ -16,9 +16,9 @@
         "framework": "Micronaut",
         "language": "Java",
         "flavor": "None",
-        "orm": "raw",
+        "orm": "Raw",
         "platform": "Netty",
-        "webserver": "None",
+        "webserver": "Netty",
         "os": "Linux",
         "database_os": "Linux",
         "display_name": "Micronaut Vertx PG Client",
@@ -39,9 +39,9 @@
         "framework": "Micronaut",
         "language": "Java",
         "flavor": "None",
-        "orm": "raw",
+        "orm": "Raw",
         "platform": "Netty",
-        "webserver": "None",
+        "webserver": "Netty",
         "os": "Linux",
         "database_os": "Linux",
         "display_name": "Micronaut Vertx PG Client GraalVM",
@@ -60,9 +60,9 @@
         "framework": "Micronaut",
         "language": "Java",
         "flavor": "None",
-        "orm": "raw",
+        "orm": "Raw",
         "platform": "Netty",
-        "webserver": "None",
+        "webserver": "Netty",
         "os": "Linux",
         "database_os": "Linux",
         "display_name": "Micronaut JDBC",
@@ -81,9 +81,9 @@
         "framework": "Micronaut",
         "language": "Java",
         "flavor": "None",
-        "orm": "raw",
+        "orm": "Raw",
         "platform": "Netty",
-        "webserver": "None",
+        "webserver": "Netty",
         "os": "Linux",
         "database_os": "Linux",
         "display_name": "Micronaut JDBC GraalVM",
@@ -102,9 +102,9 @@
         "framework": "Micronaut",
         "language": "Java",
         "flavor": "None",
-        "orm": "raw",
+        "orm": "Raw",
         "platform": "Netty",
-        "webserver": "None",
+        "webserver": "Netty",
         "os": "Linux",
         "database_os": "Linux",
         "display_name": "Micronaut R2DBC",
@@ -123,9 +123,9 @@
         "framework": "Micronaut",
         "language": "Java",
         "flavor": "None",
-        "orm": "raw",
+        "orm": "Raw",
         "platform": "Netty",
-        "webserver": "None",
+        "webserver": "Netty",
         "os": "Linux",
         "database_os": "Linux",
         "display_name": "Micronaut R2DBC GraalVM",
@@ -139,14 +139,14 @@
         "update_url": "/updates?queries=",
         "port": 8080,
         "approach": "Realistic",
-        "classification": "Micro",
+        "classification": "fullstack",
         "database": "Postgres",
         "framework": "Micronaut",
         "language": "Java",
         "flavor": "None",
-        "orm": "raw",
+        "orm": "Micro",
         "platform": "Netty",
-        "webserver": "None",
+        "webserver": "Netty",
         "os": "Linux",
         "database_os": "Linux",
         "display_name": "Micronaut Data JDBC",
@@ -160,14 +160,14 @@
         "update_url": "/updates?queries=",
         "port": 8080,
         "approach": "Realistic",
-        "classification": "Micro",
+        "classification": "fullstack",
         "database": "Postgres",
         "framework": "Micronaut",
         "language": "Java",
         "flavor": "None",
-        "orm": "raw",
+        "orm": "Micro",
         "platform": "Netty",
-        "webserver": "None",
+        "webserver": "Netty",
         "os": "Linux",
         "database_os": "Linux",
         "display_name": "Micronaut Data JDBC GraalVM",
@@ -181,14 +181,14 @@
         "update_url": "/updates?queries=",
         "port": 8080,
         "approach": "Realistic",
-        "classification": "Micro",
+        "classification": "fullstack",
         "database": "MongoDB",
         "framework": "Micronaut",
         "language": "Java",
         "flavor": "None",
-        "orm": "raw",
+        "orm": "Micro",
         "platform": "Netty",
-        "webserver": "None",
+        "webserver": "Netty",
         "os": "Linux",
         "database_os": "Linux",
         "display_name": "Micronaut Data MongoDB",
@@ -202,14 +202,14 @@
         "update_url": "/updates?queries=",
         "port": 8080,
         "approach": "Realistic",
-        "classification": "Micro",
+        "classification": "fullstack",
         "database": "MongoDB",
         "framework": "Micronaut",
         "language": "Java",
         "flavor": "None",
-        "orm": "raw",
+        "orm": "Micro",
         "platform": "Netty",
-        "webserver": "None",
+        "webserver": "Netty",
         "os": "Linux",
         "database_os": "Linux",
         "display_name": "Micronaut Data MongoDB GraalVM",

+ 2 - 2
frameworks/Java/micronaut/buildSrc/build.gradle

@@ -8,6 +8,6 @@ repositories {
 }
 
 dependencies {
-    implementation "io.micronaut.gradle:micronaut-gradle-plugin:4.0.1"
-    implementation "gradle.plugin.com.github.johnrengelman:shadow:7.1.2"
+    implementation "io.micronaut.gradle:micronaut-gradle-plugin:4.3.7"
+    implementation "com.github.johnrengelman.shadow:com.github.johnrengelman.shadow.gradle.plugin:8.1.1"
 }

Kaikkia tiedostoja ei voida näyttää, sillä liian monta tiedostoa muuttui tässä diffissä