Browse Source

Removed some tests + Performance optimizations (#6167)

* Removed some tests
Performance optimizations

* Disabled lot of unrequired tests
Sumeet Chhetri 4 years ago
parent
commit
67a3132ef7

+ 242 - 202
frameworks/C++/ffead-cpp/benchmark_config.json

@@ -8,7 +8,6 @@
 			"query_url": "/te-benchmark-um/queries?queries=",
 			"fortune_url": "/te-benchmark-um/fortunes",
 			"update_url": "/te-benchmark-um/updates?queries=",
-			"cached_query_url": "/te-benchmark-um/cached-worlds?count=",
 			"port": 8080,
 			"approach": "Realistic",
 			"classification": "Fullstack",
@@ -25,31 +24,26 @@
 			"versus": "",
 			"tags": []
 		},
-		"mongo-raw": {
-			"json_url": "/te-benchmark-um-mgr/json",
+		"libreactor": {
+			"json_url": "/te-benchmark-um/json",
 			"plaintext_url": "/plaintext",
-			"db_url": "/te-benchmark-um-mgr/db",
-			"query_url": "/te-benchmark-um-mgr/queries?queries=",
-			"fortune_url": "/te-benchmark-um-mgr/fortunes",
-			"update_url": "/te-benchmark-um-mgr/updates?queries=",
-			"cached_query_url": "/te-benchmark-um-mgr/cached-worlds?count=",
 			"port": 8080,
 			"approach": "Realistic",
 			"classification": "Fullstack",
-			"database": "mongodb",
+			"database": "None",
 			"framework": "ffead-cpp",
 			"language": "C++",
-			"orm": "Raw",
+			"orm": "None",
 			"platform": "None",
-			"webserver": "ffead-cpp",
+			"webserver": "libreactor",
 			"os": "Linux",
 			"database_os": "Linux",
-			"display_name": "ffead-cpp-mongo-raw",
-			"notes": "mongodb raw memory",
+			"display_name": "ffead-cpp-libreactor",
+			"notes": "",
 			"versus": "",
 			"tags": []
 		},
-		"lithium": {
+		"crystal-http": {
 			"json_url": "/te-benchmark-um/json",
 			"plaintext_url": "/plaintext",
 			"port": 8080,
@@ -60,15 +54,15 @@
 			"language": "C++",
 			"orm": "None",
 			"platform": "None",
-			"webserver": "lithium",
+			"webserver": "crystal-http",
 			"os": "Linux",
 			"database_os": "Linux",
-			"display_name": "ffead-cpp-lithium",
+			"display_name": "ffead-cpp-crystal-http",
 			"notes": "",
 			"versus": "",
 			"tags": []
 		},
-		"cinatra": {
+		"d-hunt": {
 			"json_url": "/te-benchmark-um/json",
 			"plaintext_url": "/plaintext",
 			"port": 8080,
@@ -79,15 +73,15 @@
 			"language": "C++",
 			"orm": "None",
 			"platform": "None",
-			"webserver": "cinatra",
+			"webserver": "hunt",
 			"os": "Linux",
 			"database_os": "Linux",
-			"display_name": "ffead-cpp-cinatra",
+			"display_name": "ffead-cpp-d-hunt",
 			"notes": "",
 			"versus": "",
 			"tags": []
 		},
-		"drogon": {
+		"go-gnet": {
 			"json_url": "/te-benchmark-um/json",
 			"plaintext_url": "/plaintext",
 			"port": 8080,
@@ -98,15 +92,15 @@
 			"language": "C++",
 			"orm": "None",
 			"platform": "None",
-			"webserver": "drogon",
+			"webserver": "gnet",
 			"os": "Linux",
 			"database_os": "Linux",
-			"display_name": "ffead-cpp-drogon",
+			"display_name": "ffead-cpp-go-gnet",
 			"notes": "",
 			"versus": "",
 			"tags": []
 		},
-		"libreactor": {
+		"rust-actix": {
 			"json_url": "/te-benchmark-um/json",
 			"plaintext_url": "/plaintext",
 			"port": 8080,
@@ -117,34 +111,39 @@
 			"language": "C++",
 			"orm": "None",
 			"platform": "None",
-			"webserver": "libreactor",
+			"webserver": "actix",
 			"os": "Linux",
 			"database_os": "Linux",
-			"display_name": "ffead-cpp-libreactor",
+			"display_name": "ffead-cpp-rust-actix",
 			"notes": "",
 			"versus": "",
 			"tags": []
 		},
-		"h2o": {
-			"json_url": "/te-benchmark-um/json",
+		"v-picov": {
+			"json_url": "/te-benchmark-um-pq/json",
 			"plaintext_url": "/plaintext",
+			"db_url": "/te-benchmark-um-pq/db",
+			"query_url": "/te-benchmark-um-pq/queries?queries=",
+			"fortune_url": "/te-benchmark-um-pq/fortunes",
+			"update_url": "/te-benchmark-um-pq/updates?queries=",
+			"cached_query_url": "/te-benchmark-um-pq/cached-worlds?count=",
 			"port": 8080,
 			"approach": "Realistic",
 			"classification": "Fullstack",
-			"database": "None",
+			"database": "postgres",
 			"framework": "ffead-cpp",
 			"language": "C++",
-			"orm": "None",
+			"orm": "Raw",
 			"platform": "None",
-			"webserver": "h2o",
+			"webserver": "picov",
 			"os": "Linux",
 			"database_os": "Linux",
-			"display_name": "ffead-cpp-h2o",
+			"display_name": "ffead-cpp-v-picov",
 			"notes": "",
 			"versus": "",
 			"tags": []
 		},
-		"crystal-h2o": {
+		"java-firenio": {
 			"json_url": "/te-benchmark-um/json",
 			"plaintext_url": "/plaintext",
 			"port": 8080,
@@ -155,167 +154,189 @@
 			"language": "C++",
 			"orm": "None",
 			"platform": "None",
-			"webserver": "h2o.cr",
+			"webserver": "firenio",
 			"os": "Linux",
 			"database_os": "Linux",
-			"display_name": "ffead-cpp-crystal-h2o",
+			"display_name": "ffead-cpp-java-firenio",
 			"notes": "",
 			"versus": "",
 			"tags": []
 		},
-		"crystal-http": {
+		"postgresql": {
 			"json_url": "/te-benchmark-um/json",
 			"plaintext_url": "/plaintext",
+			"db_url": "/te-benchmark-um/db",
+			"query_url": "/te-benchmark-um/queries?queries=",
+			"fortune_url": "/te-benchmark-um/fortunes",
+			"update_url": "/te-benchmark-um/updates?queries=",
 			"port": 8080,
 			"approach": "Realistic",
 			"classification": "Fullstack",
-			"database": "None",
+			"database": "postgres",
 			"framework": "ffead-cpp",
 			"language": "C++",
-			"orm": "None",
+			"orm": "Full",
 			"platform": "None",
-			"webserver": "crystal-http",
+			"webserver": "ffead-cpp",
 			"os": "Linux",
 			"database_os": "Linux",
-			"display_name": "ffead-cpp-crystal-http",
+			"display_name": "ffead-cpp-postgresql",
 			"notes": "",
 			"versus": "",
 			"tags": []
 		},
-		"d-hunt": {
-			"json_url": "/te-benchmark-um/json",
+		"postgresql-raw": {
+			"json_url": "/te-benchmark-um-pq/json",
 			"plaintext_url": "/plaintext",
+			"db_url": "/te-benchmark-um-pq/db",
+			"query_url": "/te-benchmark-um-pq/queries?queries=",
+			"fortune_url": "/te-benchmark-um-pq/fortunes",
+			"update_url": "/te-benchmark-um-pq/updates?queries=",
+			"cached_query_url": "/te-benchmark-um-pq/cached-worlds?count=",
 			"port": 8080,
 			"approach": "Realistic",
 			"classification": "Fullstack",
-			"database": "None",
+			"database": "postgres",
 			"framework": "ffead-cpp",
 			"language": "C++",
-			"orm": "None",
+			"orm": "Raw",
 			"platform": "None",
-			"webserver": "hunt",
+			"webserver": "ffead-cpp",
 			"os": "Linux",
 			"database_os": "Linux",
-			"display_name": "ffead-cpp-d-hunt",
-			"notes": "",
+			"display_name": "ffead-cpp-postgresql-raw",
+			"notes": "memory",
 			"versus": "",
 			"tags": []
 		},
-		"go-gnet": {
-			"json_url": "/te-benchmark-um/json",
-			"plaintext_url": "/plaintext",
+		"postgresql-raw-profiled": {
+			"db_url": "/te-benchmark-um-pq/db",
+			"query_url": "/te-benchmark-um-pq/queries?queries=",
+			"fortune_url": "/te-benchmark-um-pq/fortunes",
+			"update_url": "/te-benchmark-um-pq/updates?queries=",
 			"port": 8080,
 			"approach": "Realistic",
 			"classification": "Fullstack",
-			"database": "None",
+			"database": "postgres",
 			"framework": "ffead-cpp",
 			"language": "C++",
-			"orm": "None",
+			"orm": "Raw",
 			"platform": "None",
-			"webserver": "gnet",
+			"webserver": "ffead-cpp",
 			"os": "Linux",
 			"database_os": "Linux",
-			"display_name": "ffead-cpp-go-gnet",
-			"notes": "",
+			"display_name": "ffead-cpp-postgresql-raw-profiled",
+			"notes": "memory profiled",
 			"versus": "",
 			"tags": []
 		},
-		"go-fasthttp": {
-			"json_url": "/te-benchmark-um/json",
-			"plaintext_url": "/plaintext",
+		"postgresql-raw-clibpqb-profiled": {
+			"db_url": "/te-benchmark-um-pq/db",
+			"query_url": "/te-benchmark-um-pq/queries?queries=",
+			"fortune_url": "/te-benchmark-um-pq/fortunes",
+			"update_url": "/te-benchmark-um-pq/updates?queries=",
 			"port": 8080,
 			"approach": "Realistic",
 			"classification": "Fullstack",
-			"database": "None",
+			"database": "postgres",
 			"framework": "ffead-cpp",
 			"language": "C++",
-			"orm": "None",
+			"orm": "Raw",
 			"platform": "None",
-			"webserver": "fasthttp",
+			"webserver": "ffead-cpp",
 			"os": "Linux",
 			"database_os": "Linux",
-			"display_name": "ffead-cpp-go-fasthttp",
-			"notes": "",
+			"display_name": "ffead-cpp-postgresql-raw-clibpqb-profiled",
+			"notes": "memory libpq batch patch profiled",
 			"versus": "",
 			"tags": []
 		},
-		"julia-http": {
-			"json_url": "/te-benchmark-um/json",
+		"postgresql-raw-async": {
+			"json_url": "/te-benchmark-um-pq-async/json",
 			"plaintext_url": "/plaintext",
+			"db_url": "/te-benchmark-um-pq-async/db",
+			"query_url": "/te-benchmark-um-pq-async/queries?queries=",
+			"fortune_url": "/te-benchmark-um-pq-async/fortunes",
+			"update_url": "/te-benchmark-um-pq-async/bupdates?queries=",
+			"cached_query_url": "/te-benchmark-um-pq-async/cached-worlds?count=",
 			"port": 8080,
 			"approach": "Realistic",
 			"classification": "Fullstack",
-			"database": "None",
+			"database": "postgres",
 			"framework": "ffead-cpp",
 			"language": "C++",
-			"orm": "None",
+			"orm": "Raw",
 			"platform": "None",
-			"webserver": "julia-http",
+			"webserver": "ffead-cpp",
 			"os": "Linux",
 			"database_os": "Linux",
-			"display_name": "ffead-cpp-julia-http",
-			"notes": "",
+			"display_name": "ffead-cpp-postgresql-raw-async",
+			"notes": "async memory",
 			"versus": "",
-			"tags": ["broken"]
+			"tags": []
 		},
-		"swift-nio": {
-			"json_url": "/te-benchmark-um/json",
-			"plaintext_url": "/plaintext",
+		"postgresql-raw-async-profiled": {
+			"db_url": "/te-benchmark-um-pq-async/db",
+			"query_url": "/te-benchmark-um-pq-async/queries?queries=",
+			"fortune_url": "/te-benchmark-um-pq-async/fortunes",
+			"update_url": "/te-benchmark-um-pq-async/bupdates?queries=",
 			"port": 8080,
 			"approach": "Realistic",
 			"classification": "Fullstack",
-			"database": "None",
+			"database": "postgres",
 			"framework": "ffead-cpp",
 			"language": "C++",
-			"orm": "None",
+			"orm": "Raw",
 			"platform": "None",
-			"webserver": "swift-nio",
+			"webserver": "ffead-cpp",
 			"os": "Linux",
 			"database_os": "Linux",
-			"display_name": "ffead-cpp-swift-nio",
-			"notes": "",
+			"display_name": "ffead-cpp-postgresql-raw-async-profiled",
+			"notes": "async memory profiled",
 			"versus": "",
-			"tags": ["broken"]
+			"tags": []
 		},
-		"rust-actix": {
-			"json_url": "/te-benchmark-um/json",
-			"plaintext_url": "/plaintext",
+		"postgresql-raw-async-clibpqb-profiled": {
+			"db_url": "/te-benchmark-um-pq-async/db",
+			"query_url": "/te-benchmark-um-pq-async/queries?queries=",
+			"fortune_url": "/te-benchmark-um-pq-async/fortunes",
+			"update_url": "/te-benchmark-um-pq-async/bupdates?queries=",
 			"port": 8080,
 			"approach": "Realistic",
 			"classification": "Fullstack",
-			"database": "None",
+			"database": "postgres",
 			"framework": "ffead-cpp",
 			"language": "C++",
-			"orm": "None",
+			"orm": "Raw",
 			"platform": "None",
-			"webserver": "actix",
+			"webserver": "ffead-cpp",
 			"os": "Linux",
 			"database_os": "Linux",
-			"display_name": "ffead-cpp-rust-actix",
-			"notes": "",
+			"display_name": "ffead-cpp-postgresql-raw-async-clibpqb-profiled",
+			"notes": "async memory libpq batch patch profiled",
 			"versus": "",
 			"tags": []
 		},
-		"rust-hyper": {
+		"nginx": {
 			"json_url": "/te-benchmark-um/json",
 			"plaintext_url": "/plaintext",
 			"port": 8080,
 			"approach": "Realistic",
 			"classification": "Fullstack",
-			"database": "None",
+			"database": "mongodb",
 			"framework": "ffead-cpp",
 			"language": "C++",
-			"orm": "None",
+			"orm": "Full",
 			"platform": "None",
-			"webserver": "hyper",
+			"webserver": "nginx",
 			"os": "Linux",
 			"database_os": "Linux",
-			"display_name": "ffead-cpp-rust-hyper",
+			"display_name": "ffead-cpp-nginx",
 			"notes": "",
 			"versus": "",
 			"tags": []
 		},
-		"rust-thruster": {
+		"apache": {
 			"json_url": "/te-benchmark-um/json",
 			"plaintext_url": "/plaintext",
 			"port": 8080,
@@ -324,36 +345,41 @@
 			"database": "None",
 			"framework": "ffead-cpp",
 			"language": "C++",
-			"orm": "None",
+			"orm": "Full",
 			"platform": "None",
-			"webserver": "thruster",
+			"webserver": "apache",
 			"os": "Linux",
 			"database_os": "Linux",
-			"display_name": "ffead-cpp-rust-thruster",
-			"notes": "",
+			"display_name": "ffead-cpp-apache",
+			"notes": "apache mongo",
 			"versus": "",
 			"tags": ["broken"]
 		},
-		"rust-rocket": {
-			"json_url": "/te-benchmark-um/json",
+		"mongo-raw": {
+			"json_url": "/te-benchmark-um-mgr/json",
 			"plaintext_url": "/plaintext",
+			"db_url": "/te-benchmark-um-mgr/db",
+			"query_url": "/te-benchmark-um-mgr/queries?queries=",
+			"fortune_url": "/te-benchmark-um-mgr/fortunes",
+			"update_url": "/te-benchmark-um-mgr/updates?queries=",
+			"cached_query_url": "/te-benchmark-um-mgr/cached-worlds?count=",
 			"port": 8080,
 			"approach": "Realistic",
 			"classification": "Fullstack",
-			"database": "None",
+			"database": "mongodb",
 			"framework": "ffead-cpp",
 			"language": "C++",
-			"orm": "None",
+			"orm": "Raw",
 			"platform": "None",
-			"webserver": "rocket",
+			"webserver": "ffead-cpp",
 			"os": "Linux",
 			"database_os": "Linux",
-			"display_name": "ffead-cpp-rust-rocket",
-			"notes": "",
+			"display_name": "ffead-cpp-mongo-raw",
+			"notes": "mongodb raw memory",
 			"versus": "",
 			"tags": ["broken"]
 		},
-		"v-vweb": {
+		"lithium": {
 			"json_url": "/te-benchmark-um/json",
 			"plaintext_url": "/plaintext",
 			"port": 8080,
@@ -364,39 +390,34 @@
 			"language": "C++",
 			"orm": "None",
 			"platform": "None",
-			"webserver": "vweb",
+			"webserver": "lithium",
 			"os": "Linux",
 			"database_os": "Linux",
-			"display_name": "ffead-cpp-v-vweb",
+			"display_name": "ffead-cpp-lithium",
 			"notes": "",
 			"versus": "",
 			"tags": ["broken"]
 		},
-		"v-picov": {
-			"json_url": "/te-benchmark-um-pq/json",
+		"cinatra": {
+			"json_url": "/te-benchmark-um/json",
 			"plaintext_url": "/plaintext",
-			"db_url": "/te-benchmark-um-pq/db",
-			"query_url": "/te-benchmark-um-pq/queries?queries=",
-			"fortune_url": "/te-benchmark-um-pq/fortunes",
-			"update_url": "/te-benchmark-um-pq/updates?queries=",
-			"cached_query_url": "/te-benchmark-um-pq/cached-worlds?count=",
 			"port": 8080,
 			"approach": "Realistic",
 			"classification": "Fullstack",
-			"database": "postgres",
+			"database": "None",
 			"framework": "ffead-cpp",
 			"language": "C++",
-			"orm": "Raw",
+			"orm": "None",
 			"platform": "None",
-			"webserver": "picov",
+			"webserver": "cinatra",
 			"os": "Linux",
 			"database_os": "Linux",
-			"display_name": "ffead-cpp-v-picov",
+			"display_name": "ffead-cpp-cinatra",
 			"notes": "",
 			"versus": "",
-			"tags": []
+			"tags": ["broken"]
 		},
-		"java-firenio": {
+		"drogon": {
 			"json_url": "/te-benchmark-um/json",
 			"plaintext_url": "/plaintext",
 			"port": 8080,
@@ -407,15 +428,15 @@
 			"language": "C++",
 			"orm": "None",
 			"platform": "None",
-			"webserver": "firenio",
+			"webserver": "drogon",
 			"os": "Linux",
 			"database_os": "Linux",
-			"display_name": "ffead-cpp-java-firenio",
+			"display_name": "ffead-cpp-drogon",
 			"notes": "",
 			"versus": "",
-			"tags": []
+			"tags": ["broken"]
 		},
-		"java-rapidoid": {
+		"h2o": {
 			"json_url": "/te-benchmark-um/json",
 			"plaintext_url": "/plaintext",
 			"port": 8080,
@@ -426,15 +447,15 @@
 			"language": "C++",
 			"orm": "None",
 			"platform": "None",
-			"webserver": "rapidoid",
+			"webserver": "h2o",
 			"os": "Linux",
 			"database_os": "Linux",
-			"display_name": "ffead-cpp-java-rapidoid",
+			"display_name": "ffead-cpp-h2o",
 			"notes": "",
 			"versus": "",
-			"tags": []
+			"tags": ["broken"]
 		},
-		"java-wizzardo-http": {
+		"crystal-h2o": {
 			"json_url": "/te-benchmark-um/json",
 			"plaintext_url": "/plaintext",
 			"port": 8080,
@@ -445,13 +466,13 @@
 			"language": "C++",
 			"orm": "None",
 			"platform": "None",
-			"webserver": "wizzardo-http",
+			"webserver": "h2o.cr",
 			"os": "Linux",
 			"database_os": "Linux",
-			"display_name": "ffead-cpp-java-wizzardo-http",
+			"display_name": "ffead-cpp-crystal-h2o",
 			"notes": "",
 			"versus": "",
-			"tags": []
+			"tags": ["broken"]
 		},
 		"mysql": {
 			"json_url": "/te-benchmark-um/json",
@@ -474,142 +495,123 @@
 			"display_name": "ffead-cpp-mysql",
 			"notes": "",
 			"versus": "",
-			"tags": []
+			"tags": ["broken"]
 		},
-		"postgresql": {
+		"go-fasthttp": {
 			"json_url": "/te-benchmark-um/json",
 			"plaintext_url": "/plaintext",
-			"db_url": "/te-benchmark-um/db",
-			"query_url": "/te-benchmark-um/queries?queries=",
-			"fortune_url": "/te-benchmark-um/fortunes",
-			"update_url": "/te-benchmark-um/updates?queries=",
-			"cached_query_url": "/te-benchmark-um/cached-worlds?count=",
 			"port": 8080,
 			"approach": "Realistic",
 			"classification": "Fullstack",
-			"database": "postgres",
+			"database": "None",
 			"framework": "ffead-cpp",
 			"language": "C++",
-			"orm": "Full",
+			"orm": "None",
 			"platform": "None",
-			"webserver": "ffead-cpp",
+			"webserver": "fasthttp",
 			"os": "Linux",
 			"database_os": "Linux",
-			"display_name": "ffead-cpp-postgresql",
+			"display_name": "ffead-cpp-go-fasthttp",
 			"notes": "",
 			"versus": "",
-			"tags": []
+			"tags": ["broken"]
 		},
-		"postgresql-raw": {
-			"json_url": "/te-benchmark-um-pq/json",
+		"julia-http": {
+			"json_url": "/te-benchmark-um/json",
 			"plaintext_url": "/plaintext",
-			"db_url": "/te-benchmark-um-pq/db",
-			"query_url": "/te-benchmark-um-pq/queries?queries=",
-			"fortune_url": "/te-benchmark-um-pq/fortunes",
-			"update_url": "/te-benchmark-um-pq/updates?queries=",
-			"cached_query_url": "/te-benchmark-um-pq/cached-worlds?count=",
 			"port": 8080,
 			"approach": "Realistic",
 			"classification": "Fullstack",
-			"database": "postgres",
+			"database": "None",
 			"framework": "ffead-cpp",
 			"language": "C++",
-			"orm": "Raw",
+			"orm": "None",
 			"platform": "None",
-			"webserver": "ffead-cpp",
+			"webserver": "julia-http",
 			"os": "Linux",
 			"database_os": "Linux",
-			"display_name": "ffead-cpp-postgresql-raw",
-			"notes": "memory",
+			"display_name": "ffead-cpp-julia-http",
+			"notes": "",
 			"versus": "",
-			"tags": []
+			"tags": ["broken"]
 		},
-		"postgresql-raw-profiled": {
-			"db_url": "/te-benchmark-um-pq/db",
-			"query_url": "/te-benchmark-um-pq/queries?queries=",
-			"fortune_url": "/te-benchmark-um-pq/fortunes",
-			"update_url": "/te-benchmark-um-pq/updates?queries=",
+		"swift-nio": {
+			"json_url": "/te-benchmark-um/json",
+			"plaintext_url": "/plaintext",
 			"port": 8080,
 			"approach": "Realistic",
 			"classification": "Fullstack",
-			"database": "postgres",
+			"database": "None",
 			"framework": "ffead-cpp",
 			"language": "C++",
-			"orm": "Raw",
+			"orm": "None",
 			"platform": "None",
-			"webserver": "ffead-cpp",
+			"webserver": "swift-nio",
 			"os": "Linux",
 			"database_os": "Linux",
-			"display_name": "ffead-cpp-postgresql-raw-profiled",
-			"notes": "memory profiled",
+			"display_name": "ffead-cpp-swift-nio",
+			"notes": "",
 			"versus": "",
-			"tags": []
+			"tags": ["broken"]
 		},
-		"postgresql-raw-clibpqb-profiled": {
-			"db_url": "/te-benchmark-um-pq/db",
-			"query_url": "/te-benchmark-um-pq/queries?queries=",
-			"fortune_url": "/te-benchmark-um-pq/fortunes",
-			"update_url": "/te-benchmark-um-pq/bupdates?queries=",
+		"rust-hyper": {
+			"json_url": "/te-benchmark-um/json",
+			"plaintext_url": "/plaintext",
 			"port": 8080,
 			"approach": "Realistic",
 			"classification": "Fullstack",
-			"database": "postgres",
+			"database": "None",
 			"framework": "ffead-cpp",
 			"language": "C++",
-			"orm": "Raw",
+			"orm": "None",
 			"platform": "None",
-			"webserver": "ffead-cpp",
+			"webserver": "hyper",
 			"os": "Linux",
 			"database_os": "Linux",
-			"display_name": "ffead-cpp-postgresql-raw-clibpqb-profiled",
-			"notes": "memory libpq batch patch profiled",
+			"display_name": "ffead-cpp-rust-hyper",
+			"notes": "",
 			"versus": "",
-			"tags": []
+			"tags": ["broken"]
 		},
-		"postgresql-raw-async": {
-			"json_url": "/te-benchmark-um-pq-async/json",
+		"rust-thruster": {
+			"json_url": "/te-benchmark-um/json",
 			"plaintext_url": "/plaintext",
-			"db_url": "/te-benchmark-um-pq-async/db",
-			"query_url": "/te-benchmark-um-pq-async/queries?queries=",
-			"fortune_url": "/te-benchmark-um-pq-async/fortunes",
-			"update_url": "/te-benchmark-um-pq-async/updates?queries=",
-			"cached_query_url": "/te-benchmark-um-pq-async/cached-worlds?count=",
 			"port": 8080,
 			"approach": "Realistic",
 			"classification": "Fullstack",
-			"database": "postgres",
+			"database": "None",
 			"framework": "ffead-cpp",
 			"language": "C++",
-			"orm": "Raw",
+			"orm": "None",
 			"platform": "None",
-			"webserver": "ffead-cpp",
+			"webserver": "thruster",
 			"os": "Linux",
 			"database_os": "Linux",
-			"display_name": "ffead-cpp-postgresql-raw-async",
-			"notes": "async memory",
+			"display_name": "ffead-cpp-rust-thruster",
+			"notes": "",
 			"versus": "",
-			"tags": []
+			"tags": ["broken"]
 		},
-		"nginx": {
+		"rust-rocket": {
 			"json_url": "/te-benchmark-um/json",
 			"plaintext_url": "/plaintext",
 			"port": 8080,
 			"approach": "Realistic",
 			"classification": "Fullstack",
-			"database": "mongodb",
+			"database": "None",
 			"framework": "ffead-cpp",
 			"language": "C++",
-			"orm": "Full",
+			"orm": "None",
 			"platform": "None",
-			"webserver": "nginx",
+			"webserver": "rocket",
 			"os": "Linux",
 			"database_os": "Linux",
-			"display_name": "ffead-cpp-nginx",
+			"display_name": "ffead-cpp-rust-rocket",
 			"notes": "",
 			"versus": "",
-			"tags": []
+			"tags": ["broken"]
 		},
-		"apache": {
+		"v-vweb": {
 			"json_url": "/te-benchmark-um/json",
 			"plaintext_url": "/plaintext",
 			"port": 8080,
@@ -618,13 +620,51 @@
 			"database": "None",
 			"framework": "ffead-cpp",
 			"language": "C++",
-			"orm": "Full",
+			"orm": "None",
 			"platform": "None",
-			"webserver": "apache",
+			"webserver": "vweb",
 			"os": "Linux",
 			"database_os": "Linux",
-			"display_name": "ffead-cpp-apache",
-			"notes": "apache mongo",
+			"display_name": "ffead-cpp-v-vweb",
+			"notes": "",
+			"versus": "",
+			"tags": ["broken"]
+		},
+		"java-rapidoid": {
+			"json_url": "/te-benchmark-um/json",
+			"plaintext_url": "/plaintext",
+			"port": 8080,
+			"approach": "Realistic",
+			"classification": "Fullstack",
+			"database": "None",
+			"framework": "ffead-cpp",
+			"language": "C++",
+			"orm": "None",
+			"platform": "None",
+			"webserver": "rapidoid",
+			"os": "Linux",
+			"database_os": "Linux",
+			"display_name": "ffead-cpp-java-rapidoid",
+			"notes": "",
+			"versus": "",
+			"tags": ["broken"]
+		},
+		"java-wizzardo-http": {
+			"json_url": "/te-benchmark-um/json",
+			"plaintext_url": "/plaintext",
+			"port": 8080,
+			"approach": "Realistic",
+			"classification": "Fullstack",
+			"database": "None",
+			"framework": "ffead-cpp",
+			"language": "C++",
+			"orm": "None",
+			"platform": "None",
+			"webserver": "wizzardo-http",
+			"os": "Linux",
+			"database_os": "Linux",
+			"display_name": "ffead-cpp-java-wizzardo-http",
+			"notes": "",
 			"versus": "",
 			"tags": ["broken"]
 		}

+ 1 - 0
frameworks/C++/ffead-cpp/ffead-cpp-base-debug.dockerfile

@@ -13,6 +13,7 @@ RUN mkdir /installs
 COPY te-benchmark-um/ /installs/te-benchmark-um/
 COPY te-benchmark-um-pq/ /installs/te-benchmark-um-pq/
 COPY te-benchmark-um-mgr/ /installs/te-benchmark-um-mgr/
+COPY te-benchmark-um-pq-async /installs/te-benchmark-um-pq-async/
 
 WORKDIR ${IROOT}
 

+ 1 - 0
frameworks/C++/ffead-cpp/ffead-cpp-base.dockerfile

@@ -13,6 +13,7 @@ RUN mkdir /installs
 COPY te-benchmark-um/ /installs/te-benchmark-um/
 COPY te-benchmark-um-pq/ /installs/te-benchmark-um-pq/
 COPY te-benchmark-um-mgr/ /installs/te-benchmark-um-mgr/
+COPY te-benchmark-um-pq-async /installs/te-benchmark-um-pq-async/
 
 WORKDIR ${IROOT}
 

+ 7 - 0
frameworks/C++/ffead-cpp/ffead-cpp-postgresql-raw-async-clibpqb-profiled.dockerfile

@@ -0,0 +1,7 @@
+FROM sumeetchhetri/ffead-cpp-5.0-sql-raw-async-clibpqb-profiled-base:5.2
+
+ENV IROOT=/installs
+
+WORKDIR /
+
+CMD ./run_ffead.sh ffead-cpp-5.0-sql emb postgresql-raw-async memory

+ 7 - 0
frameworks/C++/ffead-cpp/ffead-cpp-postgresql-raw-async-profiled.dockerfile

@@ -0,0 +1,7 @@
+FROM sumeetchhetri/ffead-cpp-5.0-sql-raw-async-profiled-base:5.2
+
+ENV IROOT=/installs
+
+WORKDIR /
+
+CMD ./run_ffead.sh ffead-cpp-5.0-sql emb postgresql-raw-async memory

+ 85 - 0
frameworks/C++/ffead-cpp/ffead-cpp-sql-raw-async-clibpqb-profiled-base.dockerfile

@@ -0,0 +1,85 @@
+FROM sumeetchhetri/ffead-cpp-5.0-base:5.2
+LABEL maintainer="Sumeet Chhetri"
+LABEL version="5.2"
+LABEL description="SQL Raw Custom libpq batch patched Base ffead-cpp docker image with commit id - master"
+
+WORKDIR /tmp
+RUN mkdir postgresql
+
+COPY postgresql/* /tmp/postgresql/
+
+#POSTGRESQL
+WORKDIR /tmp/postgresql/
+
+# prepare PostgreSQL APT repository
+RUN apt-get -yqq update && apt-get -yqq install locales gnupg lsb-release
+
+RUN wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add -
+RUN echo "deb http://apt.postgresql.org/pub/repos/apt/ `lsb_release -cs`-pgdg main" | tee  /etc/apt/sources.list.d/pgdg.list
+
+ENV PG_VERSION 13
+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
+ENV DEBIAN_FRONTEND noninteractive
+
+# install postgresql on database machine
+RUN apt-get -yqq update && apt-get -yqq install postgresql-13 postgresql-contrib-13 &&  rm -rf /var/lib/apt/lists/*
+
+# Make sure all the configuration files in main belong to postgres
+RUN mv postgresql.conf /etc/postgresql/${PG_VERSION}/main/postgresql.conf
+RUN mv pg_hba.conf /etc/postgresql/${PG_VERSION}/main/pg_hba.conf
+
+RUN chown -Rf postgres:postgres /etc/postgresql/${PG_VERSION}/main
+
+RUN mkdir /ssd
+RUN cp -R -p /var/lib/postgresql/${PG_VERSION}/main /ssd/postgresql
+RUN cp /etc/postgresql/${PG_VERSION}/main/postgresql.conf /ssd/postgresql
+RUN mv 60-postgresql-shm.conf /etc/sysctl.d/60-postgresql-shm.conf
+
+RUN chown -Rf postgres:postgres /var/run/postgresql
+RUN chmod 2777 /var/run/postgresql
+RUN chown postgres:postgres /etc/sysctl.d/60-postgresql-shm.conf
+RUN chown postgres:postgres create-postgres*
+RUN chown -Rf postgres:postgres /ssd
+
+ENV PGDATA=/ssd/postgresql
+
+USER postgres
+
+# We have to wait for postgres to start before we can use the cli
+RUN service postgresql start && \
+    until psql -c "\q"; do sleep 1; done && \
+    psql < create-postgres-database.sql && \
+    psql -a hello_world < create-postgres.sql && \
+    service postgresql stop
+#POSTGRESQL
+
+USER root
+
+#WRK
+WORKDIR /tmp/wrk
+RUN apt-get -yqq update && apt-get -yqq install libluajit-5.1-dev libssl-dev luajit && rm -rf /var/lib/apt/lists/* && \
+	curl -sL https://github.com/wg/wrk/archive/4.1.0.tar.gz | tar xz --strip-components=1
+ENV LDFLAGS="-O3 -march=native -flto"
+ENV CFLAGS="-I /usr/include/luajit-2.1 $LDFLAGS"
+RUN make WITH_LUAJIT=/usr WITH_OPENSSL=/usr -j "$(nproc)"
+RUN cp wrk /usr/local/bin
+
+ENV name name
+ENV server_host server_host
+ENV levels levels
+ENV duration duration
+ENV max_concurrency max_concurrency
+ENV max_threads max_threads
+ENV pipeline pipeline
+ENV accept accept
+#WRK
+
+WORKDIR ${IROOT}
+
+COPY sql-async-profiled-install-clang.sh install_ffead-cpp-sql-raw-profiled.sh ${IROOT}/
+RUN chmod 755 ${IROOT}/sql-async-profiled-install-clang.sh ${IROOT}/install_ffead-cpp-sql-raw-profiled.sh
+
+RUN ./sql-async-profiled-install-clang.sh batch

+ 85 - 0
frameworks/C++/ffead-cpp/ffead-cpp-sql-raw-async-profiled-base.dockerfile

@@ -0,0 +1,85 @@
+FROM sumeetchhetri/ffead-cpp-5.0-base:5.2
+LABEL maintainer="Sumeet Chhetri"
+LABEL version="5.2"
+LABEL description="SQL Raw Base ffead-cpp docker image with commit id - master"
+
+WORKDIR /tmp
+RUN mkdir postgresql
+
+COPY postgresql/* /tmp/postgresql/
+
+#POSTGRESQL
+WORKDIR /tmp/postgresql/
+
+# prepare PostgreSQL APT repository
+RUN apt-get -yqq update && apt-get -yqq install locales gnupg lsb-release
+
+RUN wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add -
+RUN echo "deb http://apt.postgresql.org/pub/repos/apt/ `lsb_release -cs`-pgdg main" | tee  /etc/apt/sources.list.d/pgdg.list
+
+ENV PG_VERSION 13
+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
+ENV DEBIAN_FRONTEND noninteractive
+
+# install postgresql on database machine
+RUN apt-get -yqq update && apt-get -yqq install postgresql-13 postgresql-contrib-13 &&  rm -rf /var/lib/apt/lists/*
+
+# Make sure all the configuration files in main belong to postgres
+RUN mv postgresql.conf /etc/postgresql/${PG_VERSION}/main/postgresql.conf
+RUN mv pg_hba.conf /etc/postgresql/${PG_VERSION}/main/pg_hba.conf
+
+RUN chown -Rf postgres:postgres /etc/postgresql/${PG_VERSION}/main
+
+RUN mkdir /ssd
+RUN cp -R -p /var/lib/postgresql/${PG_VERSION}/main /ssd/postgresql
+RUN cp /etc/postgresql/${PG_VERSION}/main/postgresql.conf /ssd/postgresql
+RUN mv 60-postgresql-shm.conf /etc/sysctl.d/60-postgresql-shm.conf
+
+RUN chown -Rf postgres:postgres /var/run/postgresql
+RUN chmod 2777 /var/run/postgresql
+RUN chown postgres:postgres /etc/sysctl.d/60-postgresql-shm.conf
+RUN chown postgres:postgres create-postgres*
+RUN chown -Rf postgres:postgres /ssd
+
+ENV PGDATA=/ssd/postgresql
+
+USER postgres
+
+# We have to wait for postgres to start before we can use the cli
+RUN service postgresql start && \
+    until psql -c "\q"; do sleep 1; done && \
+    psql < create-postgres-database.sql && \
+    psql -a hello_world < create-postgres.sql && \
+    service postgresql stop
+#POSTGRESQL
+
+USER root
+
+#WRK
+WORKDIR /tmp/wrk
+RUN apt-get -yqq update && apt-get -yqq install libluajit-5.1-dev libssl-dev luajit && rm -rf /var/lib/apt/lists/* && \
+	curl -sL https://github.com/wg/wrk/archive/4.1.0.tar.gz | tar xz --strip-components=1
+ENV LDFLAGS="-O3 -march=native -flto"
+ENV CFLAGS="-I /usr/include/luajit-2.1 $LDFLAGS"
+RUN make WITH_LUAJIT=/usr WITH_OPENSSL=/usr -j "$(nproc)"
+RUN cp wrk /usr/local/bin
+
+ENV name name
+ENV server_host server_host
+ENV levels levels
+ENV duration duration
+ENV max_concurrency max_concurrency
+ENV max_threads max_threads
+ENV pipeline pipeline
+ENV accept accept
+#WRK
+
+WORKDIR ${IROOT}
+
+COPY sql-async-profiled-install.sh install_ffead-cpp-sql-raw-profiled.sh ${IROOT}/
+RUN chmod 755 ${IROOT}/sql-async-profiled-install.sh ${IROOT}/install_ffead-cpp-sql-raw-profiled.sh
+
+RUN ./sql-async-profiled-install.sh

+ 1 - 1
frameworks/C++/ffead-cpp/ffead-cpp-v-base.dockerfile

@@ -18,7 +18,7 @@ RUN git clone https://github.com/vlang/v && cd v && make && ./v symlink
 
 WORKDIR ${IROOT}/lang-server-backends/v/vweb
 #COPY vweb.v ${IROOT}/lang-server-backends/v/vweb/
-RUN chmod +x *.sh && ./build.sh && cp vweb $IROOT/
+#RUN chmod +x *.sh && ./build.sh && cp vweb $IROOT/
 
 WORKDIR ${IROOT}/lang-server-backends/v/pico.v
 #COPY main.v ${IROOT}/lang-server-backends/v/pico.v/

+ 1 - 1
frameworks/C++/ffead-cpp/install_ffead-cpp-backends.sh

@@ -4,7 +4,7 @@ cd $IROOT
 
 git clone https://github.com/sumeetchhetri/ffead-cpp
 cd ffead-cpp
-git checkout e6fc4e54a266ee0af1cca7a5e0e6359c06129af7 -b 5.2
+git checkout 4e98d8ba1a11505a0b7b450285b20ac0ad7a104f -b 5.0
 rm -rf .git
 cd ..
 mv ffead-cpp ffead-cpp-src

+ 13 - 5
frameworks/C++/ffead-cpp/install_ffead-cpp-sql-raw-profiled.sh

@@ -2,6 +2,12 @@
 
 chmod +x $IROOT/ffead-cpp-sql-raw/*.sh
 
+SUFFIX=""
+if [ "$1" = "async" ]
+then
+	SUFFIX="-async"
+fi
+
 cp $IROOT/ffead-cpp-sql-raw/server.sh /server_orig.sh
 
 cd $IROOT/ffead-cpp-sql-raw
@@ -42,16 +48,18 @@ service postgresql start
 
 sed -i 's|EVH_SINGLE=false|EVH_SINGLE=true|g' resources/server.prop
 nohup bash -c "./server.sh > ffead.log &"
-sleep 5
+sleep 10
 echo "ffead-cpp with sql-raw support launched"
 wrk -H 'Host: localhost' -H 'Accept: application/json,text/html;q=0.9,application/xhtml+xml;q=0.9,application/xml;q=0.8,*/*;q=0.7' \
-	-H 'Connection: keep-alive' --latency -d 15 -c 256 --timeout 8 -t 2 "http://localhost:8080/te-benchmark-um-pq/fortunes"
+	-H 'Connection: keep-alive' --latency -d 5 -c 256 --timeout 8 -t 2 "http://localhost:8080/te-benchmark-um-pq${SUFFIX}/fortunes"
+wrk -H 'Host: localhost' -H 'Accept: application/json,text/html;q=0.9,application/xhtml+xml;q=0.9,application/xml;q=0.8,*/*;q=0.7' \
+	-H 'Connection: keep-alive' --latency -d 5 -c 512 --timeout 8 -t 2 "http://localhost:8080/te-benchmark-um-pq${SUFFIX}/db"
 wrk -H 'Host: localhost' -H 'Accept: application/json,text/html;q=0.9,application/xhtml+xml;q=0.9,application/xml;q=0.8,*/*;q=0.7' \
-	-H 'Connection: keep-alive' --latency -d 15 -c 512 --timeout 8 -t 2 "http://localhost:8080/te-benchmark-um-pq/db"
+	-H 'Connection: keep-alive' --latency -d 5 -c 512 --timeout 8 -t 2 "http://localhost:8080/te-benchmark-um-pq${SUFFIX}/queries?queries=20"
 wrk -H 'Host: localhost' -H 'Accept: application/json,text/html;q=0.9,application/xhtml+xml;q=0.9,application/xml;q=0.8,*/*;q=0.7' \
-	-H 'Connection: keep-alive' --latency -d 15 -c 512 --timeout 8 -t 2 "http://localhost:8080/te-benchmark-um-pq/queries?queries=20"
+	-H 'Connection: keep-alive' --latency -d 5 -c 512 --timeout 8 -t 2 "http://localhost:8080/te-benchmark-um-pq${SUFFIX}/updates?queries=20"
 wrk -H 'Host: localhost' -H 'Accept: application/json,text/html;q=0.9,application/xhtml+xml;q=0.9,application/xml;q=0.8,*/*;q=0.7' \
-	-H 'Connection: keep-alive' --latency -d 15 -c 512 --timeout 8 -t 2 "http://localhost:8080/te-benchmark-um-pq/updates?queries=20"
+	-H 'Connection: keep-alive' --latency -d 5 -c 512 --timeout 8 -t 2 "http://localhost:8080/te-benchmark-um-pq${SUFFIX}/bupdates?queries=20"
 echo "normal shutdown"
 rm -f serv.ctrl
 pkill ffead-cpp

+ 3 - 1
frameworks/C++/ffead-cpp/run_ffead.sh

@@ -156,7 +156,9 @@ then
 	done
 elif [ "$2" = "julia-http" ]
 then
-	julia ${IROOT}/lang-server-backends/julia/http.jl/server.jl $FFEAD_CPP_PATH
+	for i in $(seq 0 $(($(nproc --all)-1))); do
+		julia ${IROOT}/lang-server-backends/julia/http.jl/server.jl $FFEAD_CPP_PATH
+	done
 elif [ "$2" = "swift-nio" ]
 then
 	cd ${IROOT}

+ 76 - 0
frameworks/C++/ffead-cpp/sql-async-profiled-install-clang.sh

@@ -0,0 +1,76 @@
+mkdir /tmp/profile-data
+
+rm -rf $IROOT/ffead-cpp-5.0-sql
+
+if [ "$1" = "batch" ]
+then
+	apt remove -yqq libpq-dev
+	apt autoremove -yqq
+	apt update && apt install -y bison flex libreadline-dev
+	cd /tmp
+	wget -q https://github.com/an-tao/postgres/archive/batch_mode_ubuntu.tar.gz
+	tar -xzf batch_mode_ubuntu.tar.gz
+	cd postgres-batch_mode_ubuntu
+	./configure --prefix=/usr CFLAGS='-O2 -pipe -march=native'
+	make && make install
+fi
+
+apt update -yqq && apt install -yqq clang
+
+cd $IROOT/ffead-cpp-src/
+rm -rf CMakeCache.txt CMakeFiles
+rm -rf web/te-benchmark-um web/te-benchmark-um-mgr web/te-benchmark-um-pq
+
+sed -i 's|add_subdirectory(${PROJECT_SOURCE_DIR}/web/te-benchmark-um)||g' CMakeLists.txt
+sed -i 's|add_subdirectory(${PROJECT_SOURCE_DIR}/web/te-benchmark-um-mgr)||g' CMakeLists.txt
+sed -i 's|add_subdirectory(${PROJECT_SOURCE_DIR}/web/te-benchmark-um-pq)||g' CMakeLists.txt
+sed -i 's|install(FILES ${PROJECT_BINARY_DIR}/web/te-benchmark-um/libte_benchmark_um${LIB_EXT} DESTINATION ${PROJECT_NAME}-bin/lib)||g' CMakeLists.txt
+sed -i 's|install(FILES ${PROJECT_BINARY_DIR}/web/te-benchmark-um-mgr/libte_benchmark_um_mgr${LIB_EXT} DESTINATION ${PROJECT_NAME}-bin/lib)||g' CMakeLists.txt
+sed -i 's|install(FILES ${PROJECT_BINARY_DIR}/web/te-benchmark-um-pq/libte_benchmark_um_pq${LIB_EXT} DESTINATION ${PROJECT_NAME}-bin/lib)||g' CMakeLists.txt
+
+sed -i 's|tfb-database|localhost|g' $IROOT/ffead-cpp-src/web/te-benchmark-um-pq-async/config/sdorm.xml
+
+rm -rf build
+mkdir build
+cd build
+CC=/usr/bin/clang CXX=/usr/bin/clang++ CXXFLAGS="-march=native -flto -fprofile-instr-generate=/tmp/cprof.prof" cmake -DSRV_EMB=on -DMOD_REDIS=on ..
+make install && mv $IROOT/ffead-cpp-src/ffead-cpp-5.0-bin $IROOT/ffead-cpp-sql-raw
+
+#Start postgresql
+service postgresql stop
+#For profiling/benchmarking
+
+cd $IROOT/
+sed -i 's|cmake .|CC=/usr/bin/clang CXX=/usr/bin/clang++ cmake .|g' $IROOT/ffead-cpp-sql-raw/resources/rundyn-automake.sh
+#sed -i 's|-fprofile-instr-generate=/tmp/cprof.prof|-fprofile-instr-generate=/tmp/cprofdi.prof|g' $IROOT/ffead-cpp-sql-raw/rtdcf/CMakeLists.txt.template
+./install_ffead-cpp-sql-raw-profiled.sh async
+rm -rf $IROOT/ffead-cpp-sql-raw
+
+cd $IROOT/ffead-cpp-src
+rm -rf build
+mkdir build
+cd build
+llvm-profdata-10 merge -output=/tmp/cprof.pgo  /tmp/cprof.prof
+#llvm-profdata-10 merge -output=/tmp/cprofdi.pgo  /tmp/cprofdi.prof
+ls -ltr /tmp/cprof*
+CC=/usr/bin/clang CXX=/usr/bin/clang++ CXXFLAGS="-march=native -flto -fprofile-instr-use=/tmp/cprof.pgo" cmake -DSRV_EMB=on -DMOD_MEMCACHED=on -DMOD_REDIS=on -DMOD_SDORM_MONGO=on ..
+make install && mv $IROOT/ffead-cpp-src/ffead-cpp-5.0-bin $IROOT/ffead-cpp-sql-raw
+
+#Start postgresql
+service postgresql stop
+#For profiling/benchmarking
+
+cd $IROOT/
+sed -i 's|cmake .|CC=/usr/bin/clang CXX=/usr/bin/clang++ cmake .|g' $IROOT/ffead-cpp-sql-raw/resources/rundyn-automake.sh
+#sed -i 's|-fprofile-instr-use=/tmp/cprof.pgo|-fprofile-instr-use=/tmp/cprofdi.pgo|g' $IROOT/ffead-cpp-sql-raw/rtdcf/CMakeLists.txt.template
+./install_ffead-cpp-sql-raw-profiled.sh async
+mv $IROOT/ffead-cpp-sql-raw $IROOT/ffead-cpp-5.0-sql
+
+sed -i 's|localhost|tfb-database|g' $IROOT/ffead-cpp-5.0-sql/web/te-benchmark-um-pq-async/config/sdorm.xml
+
+apt remove -yqq postgresql-13 postgresql-contrib-13 gnupg lsb-release
+apt autoremove -yqq
+rm -rf /ssd/postgresql
+rm -rf /tmp/postgresql
+rm -rf /tmp/wrk /usr/local/bin/wrk
+

+ 69 - 0
frameworks/C++/ffead-cpp/sql-async-profiled-install.sh

@@ -0,0 +1,69 @@
+mkdir /tmp/profile-data
+
+rm -rf $IROOT/ffead-cpp-5.0-sql
+
+if [ "$1" = "batch" ]
+then
+	apt remove -yqq libpq-dev
+	apt autoremove -yqq
+	apt update && apt install -y bison flex libreadline-dev
+	cd /tmp
+	wget -q https://github.com/an-tao/postgres/archive/batch_mode_ubuntu.tar.gz
+	tar -xzf batch_mode_ubuntu.tar.gz
+	cd postgres-batch_mode_ubuntu
+	./configure --prefix=/usr CFLAGS='-O2 -pipe -march=native'
+	make && make install
+fi
+
+cd $IROOT/ffead-cpp-src/
+rm -rf CMakeCache.txt CMakeFiles
+rm -rf web/te-benchmark-um web/te-benchmark-um-mgr web/te-benchmark-um-pq
+
+sed -i 's|add_subdirectory(${PROJECT_SOURCE_DIR}/web/te-benchmark-um)||g' CMakeLists.txt
+sed -i 's|add_subdirectory(${PROJECT_SOURCE_DIR}/web/te-benchmark-um-mgr)||g' CMakeLists.txt
+sed -i 's|add_subdirectory(${PROJECT_SOURCE_DIR}/web/te-benchmark-um-pq)||g' CMakeLists.txt
+sed -i 's|install(FILES ${PROJECT_BINARY_DIR}/web/te-benchmark-um/libte_benchmark_um${LIB_EXT} DESTINATION ${PROJECT_NAME}-bin/lib)||g' CMakeLists.txt
+sed -i 's|install(FILES ${PROJECT_BINARY_DIR}/web/te-benchmark-um-mgr/libte_benchmark_um_mgr${LIB_EXT} DESTINATION ${PROJECT_NAME}-bin/lib)||g' CMakeLists.txt
+sed -i 's|install(FILES ${PROJECT_BINARY_DIR}/web/te-benchmark-um-pq/libte_benchmark_um_pq${LIB_EXT} DESTINATION ${PROJECT_NAME}-bin/lib)||g' CMakeLists.txt
+
+sed -i 's|tfb-database|localhost|g' $IROOT/ffead-cpp-src/web/te-benchmark-um-pq-async/config/sdorm.xml
+
+rm -rf build
+mkdir build
+cd build
+CXXFLAGS="-march=native -flto -fprofile-dir=/tmp/profile-data -fprofile-generate" cmake -DSRV_EMB=on -DMOD_REDIS=on ..
+make install && mv $IROOT/ffead-cpp-src/ffead-cpp-5.0-bin $IROOT/ffead-cpp-sql-raw
+
+#Start postgresql
+service postgresql stop
+#For profiling/benchmarking
+
+cd $IROOT/
+#sed -i 's|cmake .|cmake -DCMAKE_EXE_LINKER_FLAGS="-fprofile-dir=/tmp/profile-data -fprofile-generate" -DCMAKE_CXX_FLAGS="-march=native -fprofile-dir=/tmp/profile-data  -fprofile-generate" .|g' $IROOT/ffead-cpp-sql-raw/resources/rundyn-automake.sh
+./install_ffead-cpp-sql-raw-profiled.sh async
+rm -rf $IROOT/ffead-cpp-sql-raw
+
+cd $IROOT/ffead-cpp-src
+rm -rf build
+mkdir build
+cd build
+CXXFLAGS="-march=native -flto -fprofile-dir=/tmp/profile-data -fprofile-use=/tmp/profile-data -fprofile-correction" cmake -DSRV_EMB=on -DMOD_MEMCACHED=on -DMOD_REDIS=on -DMOD_SDORM_MONGO=on ..
+make install && mv $IROOT/ffead-cpp-src/ffead-cpp-5.0-bin $IROOT/ffead-cpp-sql-raw
+
+#Start postgresql
+service postgresql stop
+#For profiling/benchmarking
+
+cd $IROOT/
+#sed -i 's|cmake .|CXXFLAGS="-march=native -fprofile-dir=/tmp/profile-data -fprofile-use -fprofile-correction" cmake .|g' $IROOT/ffead-cpp-sql-raw/resources/rundyn-automake.sh
+./install_ffead-cpp-sql-raw-profiled.sh async
+mv $IROOT/ffead-cpp-sql-raw $IROOT/ffead-cpp-5.0-sql
+
+sed -i 's|localhost|tfb-database|g' $IROOT/ffead-cpp-5.0-sql/web/te-benchmark-um-pq-async/config/sdorm.xml
+
+apt remove -yqq postgresql-13 postgresql-contrib-13 gnupg lsb-release
+apt autoremove -yqq
+rm -rf /ssd/postgresql
+rm -rf /tmp/postgresql
+rm -rf /tmp/wrk /usr/local/bin/wrk
+

+ 5 - 5
frameworks/C++/ffead-cpp/te-benchmark-um-mgr/src/TeBkUmMgr.cpp

@@ -351,7 +351,7 @@ bool TeBkUmMgrRouter::route(HttpRequest* req, HttpResponse* res, void* dlib, voi
 		//t.start();
 		TeBkUmMgrMessage msg;
 		msg.setMessage(HELLO_WORLD);
-		res->setContent(JSONSerialize::serializeUnknown(&msg, 0, "TeBkUmMgrMessage"));
+		JSONSerialize::serializeUnknown(&msg, 0, "TeBkUmMgrMessage", res->getContentP());
 		res->setContentType(ContentTypes::CONTENT_TYPE_APPLICATION_JSON);
 		res->setHTTPResponseStatus(HTTPResponseStatus::Ok);
 		//t.end();
@@ -365,7 +365,7 @@ bool TeBkUmMgrRouter::route(HttpRequest* req, HttpResponse* res, void* dlib, voi
 		//t.end();
 		//CommonUtils::tsContExec += t.timerNanoSeconds();
 		//t.start();
-		res->setContent(JSONSerialize::serializeUnknown(&msg, 0, "TeBkUmMgrWorld"));
+		JSONSerialize::serializeUnknown(&msg, 0, "TeBkUmMgrWorld", res->getContentP());
 		res->setContentType(ContentTypes::CONTENT_TYPE_APPLICATION_JSON);
 		res->setHTTPResponseStatus(HTTPResponseStatus::Ok);
 		//t.end();
@@ -381,7 +381,7 @@ bool TeBkUmMgrRouter::route(HttpRequest* req, HttpResponse* res, void* dlib, voi
 		//t.end();
 		//CommonUtils::tsContExec += t.timerNanoSeconds();
 		//t.start();
-		res->setContent(JSONSerialize::serializeUnknown(&msg, 100, "std::vector<TeBkUmMgrWorld>"));
+		JSONSerialize::serializeUnknown(&msg, 100, "std::vector<TeBkUmMgrWorld>", res->getContentP());
 		res->setContentType(ContentTypes::CONTENT_TYPE_APPLICATION_JSON);
 		res->setHTTPResponseStatus(HTTPResponseStatus::Ok);
 		//t.end();
@@ -411,7 +411,7 @@ bool TeBkUmMgrRouter::route(HttpRequest* req, HttpResponse* res, void* dlib, voi
 		//t.end();
 		//CommonUtils::tsContExec += t.timerNanoSeconds();
 		//t.start();
-		res->setContent(JSONSerialize::serializeUnknown(&msg, 100, "std::vector<TeBkUmMgrWorld>"));
+		JSONSerialize::serializeUnknown(&msg, 100, "std::vector<TeBkUmMgrWorld>", res->getContentP());
 		res->setContentType(ContentTypes::CONTENT_TYPE_APPLICATION_JSON);
 		res->setHTTPResponseStatus(HTTPResponseStatus::Ok);
 		//t.end();
@@ -427,7 +427,7 @@ bool TeBkUmMgrRouter::route(HttpRequest* req, HttpResponse* res, void* dlib, voi
 		//t.end();
 		//CommonUtils::tsContExec += t.timerNanoSeconds();
 		//t.start();
-		res->setContent(JSONSerialize::serializeUnknown(&msg, 100, "std::vector<TeBkUmMgrWorld>"));
+		JSONSerialize::serializeUnknown(&msg, 100, "std::vector<TeBkUmMgrWorld>", res->getContentP());
 		res->setContentType(ContentTypes::CONTENT_TYPE_APPLICATION_JSON);
 		res->setHTTPResponseStatus(HTTPResponseStatus::Ok);
 		//t.end();

+ 6 - 0
frameworks/C++/ffead-cpp/te-benchmark-um-pq-async/include/TeBkUmLpqAsync.h

@@ -116,6 +116,11 @@ class TeBkUmLpqAsyncRouter : public Router {
 	void updatesAsync(const char* q, int ql, AsyncReq* req);
 	static void updatesAsyncChQ(void* ctx, bool status, const std::string& q, int counter);
 	static void updatesAsyncChU(void* ctx, bool status, const std::string& q, int counter);
+
+	static std::string& getUpdQuery(int count);
+	void updatesAsyncb(const char* q, int ql, AsyncReq* req);
+	static void updatesAsyncbChQ(void* ctx, bool status, const std::string& q, int counter);
+	static void updatesAsyncbChU(void* ctx, bool status, const std::string& q, int counter);
 	
 	void cachedWorlds(const char*, int, std::vector<TeBkUmLpqAsyncWorld>&);
 	static void updateCacheAsyncUtil(void* ctx, int rn, std::vector<LibpqRes>& data);
@@ -125,6 +130,7 @@ class TeBkUmLpqAsyncRouter : public Router {
 	static void getContextAsyncUtil(void* ctx, int rn, int cn, char * d, int l);
 	static void getContextAsyncCh(void* ctx, bool status, const std::string& q, int counter);
 
+	static std::map<int, std::string> _qC;
 	LibpqDataSourceImpl* sqli;
 	LibpqDataSourceImpl* getDb();
 public:

+ 172 - 65
frameworks/C++/ffead-cpp/te-benchmark-um-pq-async/src/TeBkUmLpqAsync.cpp

@@ -88,6 +88,7 @@ std::string TeBkUmLpqAsyncRouter::WORLD = "world";
 std::string TeBkUmLpqAsyncRouter::WORLD_ONE_QUERY = "select id, randomnumber from world where id = $1";
 std::string TeBkUmLpqAsyncRouter::WORLD_ALL_QUERY = "select id, randomnumber from world";
 std::string TeBkUmLpqAsyncRouter::FORTUNE_ALL_QUERY = "select id, message from fortune";
+std::map<int, std::string> TeBkUmLpqAsyncRouter::_qC;
 
 void TeBkUmLpqAsyncRouter::dbAsync(AsyncReq* req) {
 	req->d = new TeBkUmLpqAsyncWorld;
@@ -111,13 +112,13 @@ void TeBkUmLpqAsyncRouter::dbAsyncUtil(void* ctx, int rn, int cn, char * d) {
 void TeBkUmLpqAsyncRouter::dbAsyncCh(void* ctx, bool status, const std::string& q, int counter) {
 	AsyncReq* req = (AsyncReq*)ctx;
 	TeBkUmLpqAsyncWorld* w = (TeBkUmLpqAsyncWorld*)req->d;
-	req->r.setContent(JSONSerialize::serializeUnknown(w, 0, "TeBkUmLpqAsyncWorld", APP_NAME));
-	req->r.setContentType(ContentTypes::CONTENT_TYPE_APPLICATION_JSON);
 	req->r.setHTTPResponseStatus(HTTPResponseStatus::Ok);
-	ResponseData d;
-	req->r.generateHeadResponse(d._b);
-	d._b += req->r.getContent();
-	req->sif->writeTo(&d);
+	std::string c;
+	JSONSerialize::serializeUnknown(w, 0, "TeBkUmLpqAsyncWorld", &c, APP_NAME);
+	std::string d;
+	req->r.generateHeadResponse(d, ContentTypes::CONTENT_TYPE_APPLICATION_JSON, (int)c.length());
+	req->sif->writeDirect(d);
+	req->sif->writeDirect(c);
 	req->sif->unUse();
 	delete w;
 	delete req;
@@ -160,19 +161,128 @@ void TeBkUmLpqAsyncRouter::queriesAsyncUtil(void* ctx, int rn, int cn, char * d)
 void TeBkUmLpqAsyncRouter::queriesAsyncCh(void* ctx, bool status, const std::string& q, int counter) {
 	AsyncReq* req = (AsyncReq*)ctx;
 	std::vector<TeBkUmLpqAsyncWorld>* vec = (std::vector<TeBkUmLpqAsyncWorld>*)req->d;
-	req->r.setContent(JSONSerialize::serializeUnknown(vec, 100, "std::vector<TeBkUmLpqAsyncWorld>", APP_NAME));
-	req->r.setContentType(ContentTypes::CONTENT_TYPE_APPLICATION_JSON);
 	req->r.setHTTPResponseStatus(HTTPResponseStatus::Ok);
-	ResponseData d;
-	req->r.generateHeadResponse(d._b);
-	d._b += req->r.getContent();
-	req->sif->writeTo(&d);
+	std::string c;
+	JSONSerialize::serializeUnknown(vec, 100, "std::vector<TeBkUmLpqAsyncWorld>", &c, APP_NAME);
+	std::string d;
+	req->r.generateHeadResponse(d, ContentTypes::CONTENT_TYPE_APPLICATION_JSON, (int)c.length());
+	req->sif->writeDirect(d);
+	req->sif->writeDirect(c);
 	req->sif->unUse();
 	delete vec;
 	delete req;
 }
 
 
+std::string& TeBkUmLpqAsyncRouter::getUpdQuery(int count) {
+	std::map<int, std::string>::iterator it = _qC.find(count);
+	if(it!=_qC.end()) {
+		return it->second;
+	}
+
+	std::stringstream ss;
+	ss << "update world as t set randomnumber = case id ";
+
+	int pc = 1;
+	for (int c = 0; c < count; ++c) {
+		ss << "when $";
+		ss << pc++;
+		ss << " then $";
+		ss << pc++;
+	}
+	ss << "else randomnumber end where id in (";
+	for (int c = 0; c < count; ++c) {
+		ss << "$" << pc++ << ",";
+	}
+	std::string q = ss.str();
+	q = q.substr(0, q.length()-1);
+	q += ")";
+	_qC[count] = std::move(q);
+	return _qC[count];
+}
+
+void TeBkUmLpqAsyncRouter::updatesAsyncb(const char* q, int ql, AsyncReq* req) {
+	req->d = new std::vector<TeBkUmLpqAsyncWorld>;
+
+	int queryCount = 0;
+	strToNum(q, ql, queryCount);
+	if(queryCount<1)queryCount=1;
+	else if(queryCount>500)queryCount=500;
+
+	LibpqDataSourceImpl* sqli = getDb();
+	req->sqli = sqli;
+
+	try {
+		void* areq = NULL;
+		for (int c = 0; c < queryCount; ++c) {
+			int rid = rand() % 10000 + 1;
+			std::vector<LibpqParam> pars;
+			LibpqDataSourceImpl::ADD_INT4(pars, rid);
+			areq = sqli->executeQueryAsync(WORLD_ONE_QUERY, std::move(pars), req, &TeBkUmLpqAsyncRouter::queriesAsyncUtil, &TeBkUmLpqAsyncRouter::updatesAsyncbChQ, areq);
+		}
+		sqli->completeAsync(areq);
+	} catch(const std::exception& e) {
+		throw e;
+	}
+}
+void TeBkUmLpqAsyncRouter::updatesAsyncbChQ(void* ctx, bool status, const std::string& q, int counter) {
+	AsyncReq* req = (AsyncReq*)ctx;
+	std::vector<TeBkUmLpqAsyncWorld>* vec = (std::vector<TeBkUmLpqAsyncWorld>*)req->d;
+
+	LibpqDataSourceImpl* sqli = req->sqli;
+
+	int queryCount = (int)vec->size();
+	std::vector<LibpqParam> pars;
+
+	for (int c = 0; c < queryCount; ++c) {
+		LibpqDataSourceImpl::ADD_INT4(pars, vec->at(c).getId());
+
+		int newRandomNumber = rand() % 10000 + 1;
+		if(vec->at(c).getRandomNumber() == newRandomNumber) {
+			newRandomNumber += 1;
+			if(newRandomNumber>=10000) {
+				newRandomNumber = 1;
+			}
+		}
+		LibpqDataSourceImpl::ADD_INT4(pars, newRandomNumber);
+		vec->at(c).setRandomNumber(newRandomNumber);
+	}
+	for (int c = 0; c < queryCount; ++c) {
+		LibpqDataSourceImpl::ADD_INT4(pars, vec->at(c).getId());
+	}
+
+	void* areq = sqli->beginAsync(NULL);
+	sqli->executeUpdateQueryAsync(getUpdQuery(queryCount), std::move(pars), NULL, NULL, areq, true);
+	sqli->commitAsync(areq);
+
+	AsyncReq* ar = new AsyncReq;
+	ar->sif = req->sif;
+	ar->r = std::move(req->r);
+	ar->d = req->d;
+	req->d = NULL;
+	req->sif = NULL;
+
+	try {
+		sqli->completeAsync(areq, ar, &TeBkUmLpqAsyncRouter::updatesAsyncbChU);
+	} catch(const std::exception& e) {
+		throw e;
+	}
+}
+void TeBkUmLpqAsyncRouter::updatesAsyncbChU(void* ctx, bool status, const std::string& q, int counter) {
+	AsyncReq* req = (AsyncReq*)ctx;
+	std::vector<TeBkUmLpqAsyncWorld>* vec = (std::vector<TeBkUmLpqAsyncWorld>*)req->d;
+	req->r.setHTTPResponseStatus(HTTPResponseStatus::Ok);
+	std::string c;
+	JSONSerialize::serializeUnknown(vec, 100, "std::vector<TeBkUmLpqAsyncWorld>", &c, APP_NAME);
+	std::string d;
+	req->r.generateHeadResponse(d, ContentTypes::CONTENT_TYPE_APPLICATION_JSON, (int)c.length());
+	req->sif->writeDirect(d);
+	req->sif->writeDirect(c);
+	req->sif->unUse();
+	delete vec;
+	delete req;
+}
+
 void TeBkUmLpqAsyncRouter::updatesAsync(const char* q, int ql, AsyncReq* req) {
 	req->d = new std::vector<TeBkUmLpqAsyncWorld>;
 
@@ -249,13 +359,13 @@ void TeBkUmLpqAsyncRouter::updatesAsyncChQ(void* ctx, bool status, const std::st
 void TeBkUmLpqAsyncRouter::updatesAsyncChU(void* ctx, bool status, const std::string& q, int counter) {
 	AsyncReq* req = (AsyncReq*)ctx;
 	std::vector<TeBkUmLpqAsyncWorld>* vec = (std::vector<TeBkUmLpqAsyncWorld>*)req->d;
-	req->r.setContent(JSONSerialize::serializeUnknown(vec, 100, "std::vector<TeBkUmLpqAsyncWorld>", APP_NAME));
-	req->r.setContentType(ContentTypes::CONTENT_TYPE_APPLICATION_JSON);
 	req->r.setHTTPResponseStatus(HTTPResponseStatus::Ok);
-	ResponseData d;
-	req->r.generateHeadResponse(d._b);
-	d._b += req->r.getContent();
-	req->sif->writeTo(&d);
+	std::string c;
+	JSONSerialize::serializeUnknown(vec, 100, "std::vector<TeBkUmLpqAsyncWorld>", &c, APP_NAME);
+	std::string d;
+	req->r.generateHeadResponse(d, ContentTypes::CONTENT_TYPE_APPLICATION_JSON, (int)c.length());
+	req->sif->writeDirect(d);
+	req->sif->writeDirect(c);
 	req->sif->unUse();
 	delete vec;
 	delete req;
@@ -386,15 +496,20 @@ void TeBkUmLpqAsyncRouter::getContextAsyncCh(void* ctx, bool status, const std::
 		std::string msg;
 		f(&context, msg);
 		req->r.setContent(msg);
-		req->r.setContentType(ContentTypes::CONTENT_TYPE_TEXT_SHTML);
 		req->r.setHTTPResponseStatus(HTTPResponseStatus::Ok);
+		std::string d;
+		req->r.generateHeadResponse(d, ContentTypes::CONTENT_TYPE_TEXT_SHTML, (int)msg.length());
+		req->sif->writeDirect(d);
+		req->sif->writeDirect(msg);
+		req->sif->unUse();
+	}
+	else
+	{
+		ResponseData d;
+		req->r.generateHeadResponse(d._b);
+		req->sif->writeTo(&d);
+		req->sif->unUse();
 	}
-
-	ResponseData d;
-	req->r.generateHeadResponse(d._b);
-	d._b += req->r.getContent();
-	req->sif->writeTo(&d);
-	req->sif->unUse();
 }
 
 //https://stackoverflow.com/questions/9631225/convert-strings-specified-by-length-not-nul-terminated-to-int-float
@@ -410,86 +525,78 @@ bool TeBkUmLpqAsyncRouter::strToNum(const char* str, int len, int& ret) {
 
 bool TeBkUmLpqAsyncRouter::route(HttpRequest* req, HttpResponse* res, void* dlib, void* ddlib, SocketInterface* sif) {
 	std::string_view path = req->getPath();
+	sif->use();
 	if(StringUtil::endsWith(path, "/plaintext")) {
-		res->setContent(HELLO_WORLD);
-		res->setContentType(ContentTypes::CONTENT_TYPE_TEXT_PLAIN);
 		res->setHTTPResponseStatus(HTTPResponseStatus::Ok);
+		std::string d;
+		res->generateHeadResponse(d, ContentTypes::CONTENT_TYPE_TEXT_PLAIN, (int)HELLO_WORLD.length());
+		sif->writeDirect(d);
+		sif->writeDirect(HELLO_WORLD);
+		sif->unUse();
 	} else if(StringUtil::endsWith(path, "/json")) {
 		TeBkUmLpqAsyncMessage msg;
 		msg.setMessage(HELLO_WORLD);
-		res->setContent(JSONSerialize::serializeUnknown(&msg, 0, "TeBkUmLpqAsyncMessage"));
-		res->setContentType(ContentTypes::CONTENT_TYPE_APPLICATION_JSON);
 		res->setHTTPResponseStatus(HTTPResponseStatus::Ok);
+		std::string c;
+		JSONSerialize::serializeUnknown(&msg, 0, "TeBkUmLpqAsyncMessage", &c, APP_NAME);
+		std::string d;
+		res->generateHeadResponse(d, ContentTypes::CONTENT_TYPE_APPLICATION_JSON, (int)c.length());
+		sif->writeDirect(d);
+		sif->writeDirect(c);
+		sif->unUse();
 	} else if(StringUtil::endsWith(path, "/db")) {
 		AsyncReq* ar = new AsyncReq;
 		ar->sif = sif;
-		sif->use();
-		ar->r.addHeader(HttpResponse::DateHeader, res->getHeader(HttpResponse::DateHeader));
 		ar->r.update(req);
-		if(req->isClose()) {
-			ar->r.addHeader(HttpResponse::Connection, "close");
-		} else if(req->getHttpVers()>=1.1) {
-			ar->r.addHeader(HttpResponse::Connection, "keep-alive");
-		}
 		dbAsync(ar);
-		return false;
 	} else if(StringUtil::endsWith(path, "/queries")) {
 		struct yuarel_param params[1];
 		yuarel_parse_query((char*)req->getQueryStr().data(), req->getQueryStr().size(), params, 1);
 		AsyncReq* ar = new AsyncReq;
 		ar->sif = sif;
-		sif->use();
-		ar->r.addHeader(HttpResponse::DateHeader, res->getHeader(HttpResponse::DateHeader));
 		ar->r.update(req);
-		if(req->isClose()) {
-			ar->r.addHeader(HttpResponse::Connection, "close");
-		} else if(req->getHttpVers()>=1.1) {
-			ar->r.addHeader(HttpResponse::Connection, "keep-alive");
-		}
 		queriesAsync(params[0].val, params[0].val_len, ar);
-		return false;
 	} else if(StringUtil::endsWith(path, "/fortunes")) {
 		AsyncReq* ar = new AsyncReq;
 		ar->sif = sif;
-		sif->use();
 		ar->ddlib = ddlib;
-		ar->r.addHeader(HttpResponse::DateHeader, res->getHeader(HttpResponse::DateHeader));
 		ar->r.update(req);
-		if(req->isClose()) {
-			ar->r.addHeader(HttpResponse::Connection, "close");
-		} else if(req->getHttpVers()>=1.1) {
-			ar->r.addHeader(HttpResponse::Connection, "keep-alive");
-		}
 		getContextAsync(ar);
-		return false;
+	} else if(StringUtil::endsWith(path, "/bupdates")) {
+		struct yuarel_param params[1];
+		yuarel_parse_query((char*)req->getQueryStr().data(), req->getQueryStr().size(), params, 1);
+		AsyncReq* ar = new AsyncReq;
+		ar->sif = sif;
+		ar->r.update(req);
+		updatesAsyncb(params[0].val, params[0].val_len, ar);
 	} else if(StringUtil::endsWith(path, "/updates")) {
 		struct yuarel_param params[1];
 		yuarel_parse_query((char*)req->getQueryStr().data(), req->getQueryStr().size(), params, 1);
 		AsyncReq* ar = new AsyncReq;
 		ar->sif = sif;
-		sif->use();
-		ar->r.addHeader(HttpResponse::DateHeader, res->getHeader(HttpResponse::DateHeader));
 		ar->r.update(req);
-		if(req->isClose()) {
-			ar->r.addHeader(HttpResponse::Connection, "close");
-		} else if(req->getHttpVers()>=1.1) {
-			ar->r.addHeader(HttpResponse::Connection, "keep-alive");
-		}
 		updatesAsync(params[0].val, params[0].val_len, ar);
-		return false;
 	} else if(StringUtil::endsWith(path, "/cached-worlds")) {
 		struct yuarel_param params[1];
 		yuarel_parse_query((char*)req->getQueryStr().data(), req->getQueryStr().size(), params, 1);
 		std::vector<TeBkUmLpqAsyncWorld> msg;
 		cachedWorlds(params[0].val, params[0].val_len, msg);
-		res->setContent(JSONSerialize::serializeUnknown(&msg, 100, "std::vector<TeBkUmLpqAsyncWorld>"));
-		res->setContentType(ContentTypes::CONTENT_TYPE_APPLICATION_JSON);
 		res->setHTTPResponseStatus(HTTPResponseStatus::Ok);
+		std::string c;
+		JSONSerialize::serializeUnknown(&msg, 100, "std::vector<TeBkUmLpqAsyncWorld>", &c, APP_NAME);
+		std::string d;
+		res->generateHeadResponse(d, ContentTypes::CONTENT_TYPE_APPLICATION_JSON, (int)c.length());
+		sif->writeDirect(d);
+		sif->writeDirect(c);
+		sif->unUse();
 	} else {
 		res->setHTTPResponseStatus(HTTPResponseStatus::NotFound);
+		std::string d;
+		res->generateHeadResponse(d, ContentTypes::CONTENT_TYPE_TEXT_PLAIN);
+		sif->writeDirect(d);
+		sif->unUse();
 	}
-	res->setDone(true);
-	return true;
+	return false;
 }
 
 std::string TeBkUmLpqAsyncRouter::APP_NAME = "";

+ 3 - 0
frameworks/C++/ffead-cpp/te-benchmark-um-pq/include/TeBkUmLpq.h

@@ -115,8 +115,11 @@ class TeBkUmLpqRouter : public Router {
 	void getContext(HttpRequest* request, Context* context);
 	static void getContextUtil(void* ctx, int, int, char *, int);
 
+	std::map<int, std::string> _qC;
 	LibpqDataSourceImpl* sqli;
 	LibpqDataSourceImpl* getDb();
+
+	std::string& getUpdQuery(int count);
 public:
 	TeBkUmLpqRouter();
 	virtual ~TeBkUmLpqRouter();

+ 48 - 39
frameworks/C++/ffead-cpp/te-benchmark-um-pq/src/TeBkUmLpq.cpp

@@ -171,6 +171,32 @@ void TeBkUmLpqRouter::queriesMultiUtil(void* ctx, int rn, int cn, char * d, int
 	if(cn==1)w.setRandomNumber(tmp);
 }
 
+std::string& TeBkUmLpqRouter::getUpdQuery(int count) {
+	std::map<int, std::string>::iterator it = _qC.find(count);
+	if(it!=_qC.end()) {
+		return it->second;
+	}
+
+	std::stringstream ss;
+	ss << "update world as t set randomnumber = case id ";
+
+	int pc = 1;
+	for (int c = 0; c < count; ++c) {
+		ss << "when $";
+		ss << pc++;
+		ss << " then $";
+		ss << pc++;
+	}
+	ss << "else randomnumber end where id in (";
+	for (int c = 0; c < count; ++c) {
+		ss << "$" << pc++ << ",";
+	}
+	std::string q = ss.str();
+	q = q.substr(0, q.length()-1);
+	q += ")";
+	_qC[count] = std::move(q);
+	return _qC[count];
+}
 
 void TeBkUmLpqRouter::updates(const char* q, int ql, std::vector<TeBkUmLpqWorld>& wlst) {
 	int queryCount = 0;
@@ -184,21 +210,9 @@ void TeBkUmLpqRouter::updates(const char* q, int ql, std::vector<TeBkUmLpqWorld>
 		std::vector<LibpqParam> pars;
 		std::vector<LibpqParam> qp;
 
-		std::stringstream ss;
-		ss << "update world as t set randomnumber = c.randomnumber from (values";
+		std::string& query = getUpdQuery(queryCount);
 
-		int pc = 1;
 		for (int c = 0; c < queryCount; ++c) {
-			ss << "($";
-			ss << pc++;
-			ss << "::int4,$";
-			ss << pc++;
-			if(c!=queryCount-1) {
-				ss << "::int4),";
-			} else {
-				ss << "::int4)";
-			}
-
 			int rid = rand() % 10000 + 1;
 			qp.clear();
 			LibpqDataSourceImpl::ADD_INT4(qp, rid);
@@ -207,33 +221,29 @@ void TeBkUmLpqRouter::updates(const char* q, int ql, std::vector<TeBkUmLpqWorld>
 			wlst.push_back(w);
 
 			LibpqDataSourceImpl::ADD_INT4(pars, w.getId());
-			LibpqDataSourceImpl::ADD_INT4(pars, w.getRandomNumber());
+
+			int newRandomNumber = rand() % 10000 + 1;
+			if(w.getRandomNumber() == newRandomNumber) {
+				newRandomNumber += 1;
+				if(newRandomNumber>=10000) {
+					newRandomNumber = 1;
+				}
+			}
+			LibpqDataSourceImpl::ADD_INT4(pars, newRandomNumber);
+			w.setRandomNumber(newRandomNumber);
+		}
+		for (int c = 0; c < queryCount; ++c) {
+			LibpqDataSourceImpl::ADD_INT4(pars, wlst.at(c).getId());
 		}
-		ss << ") as c(id, randomnumber) where c.id = t.id";
 		
 		sqli->begin();
-		sqli->executeUpdateQuery(ss.str(), pars);
+		sqli->executeUpdateQuery(query, pars);
 		sqli->commit();
 	} catch(const std::exception& e) {
 		sqli->rollback();
 		throw e;
 	}
 }
-void TeBkUmLpqRouter::updatesUtil(void* ctx, int rn, int cn, char * d) {
-	std::vector<LibpqParam>* pars = (std::vector<LibpqParam>*)ctx;
-	if(cn==0) {
-		LibpqDataSourceImpl::ADD_INT4(*pars, *(uint32_t *)d, false);
-	} else {
-		int newRandomNumber = rand() % 10000 + 1;
-		if((int)ntohl(*((uint32_t *) d)) == newRandomNumber) {
-			newRandomNumber += 1;
-			if(newRandomNumber>=10000) {
-				newRandomNumber = 1;
-			}
-		}
-		LibpqDataSourceImpl::ADD_INT4(*pars, newRandomNumber);
-	}
-}
 
 void TeBkUmLpqRouter::updatesMulti(const char* q, int ql, std::vector<TeBkUmLpqWorld>& wlst) {
 	int queryCount = 0;
@@ -304,7 +314,6 @@ void TeBkUmLpqRouter::updatesMultiUtilCh(void* ctx, bool status, const std::stri
 	}
 }
 
-
 void TeBkUmLpqRouter::updateCache() {
 	CacheInterface* cchi = CacheManager::getImpl();
 	LibpqDataSourceImpl* sqli = getDb();
@@ -421,13 +430,13 @@ bool TeBkUmLpqRouter::route(HttpRequest* req, HttpResponse* res, void* dlib, voi
 	} else if(StringUtil::endsWith(path, "/json")) {
 		TeBkUmLpqMessage msg;
 		msg.setMessage(HELLO_WORLD);
-		res->setContent(JSONSerialize::serializeUnknown(&msg, 0, "TeBkUmLpqMessage"));
+		JSONSerialize::serializeUnknown(&msg, 0, "TeBkUmLpqMessage", res->getContentP());
 		res->setContentType(ContentTypes::CONTENT_TYPE_APPLICATION_JSON);
 		res->setHTTPResponseStatus(HTTPResponseStatus::Ok);
 	} else if(StringUtil::endsWith(path, "/db")) {
 		TeBkUmLpqWorld msg;
 		db(msg);
-		res->setContent(JSONSerialize::serializeUnknown(&msg, 0, "TeBkUmLpqWorld"));
+		JSONSerialize::serializeUnknown(&msg, 0, "TeBkUmLpqWorld", res->getContentP());
 		res->setContentType(ContentTypes::CONTENT_TYPE_APPLICATION_JSON);
 		res->setHTTPResponseStatus(HTTPResponseStatus::Ok);
 	} else if(StringUtil::endsWith(path, "/queries_old")) {
@@ -435,7 +444,7 @@ bool TeBkUmLpqRouter::route(HttpRequest* req, HttpResponse* res, void* dlib, voi
 		yuarel_parse_query((char*)req->getQueryStr().data(), req->getQueryStr().size(), params, 1);
 		std::vector<TeBkUmLpqWorld> msg;
 		queries(params[0].val, params[0].val_len, msg);
-		res->setContent(JSONSerialize::serializeUnknown(&msg, 100, "std::vector<TeBkUmLpqWorld>"));
+		JSONSerialize::serializeUnknown(&msg, 100, "std::vector<TeBkUmLpqWorld>", res->getContentP());
 		res->setContentType(ContentTypes::CONTENT_TYPE_APPLICATION_JSON);
 		res->setHTTPResponseStatus(HTTPResponseStatus::Ok);
 	} else if(StringUtil::endsWith(path, "/queries")) {
@@ -443,7 +452,7 @@ bool TeBkUmLpqRouter::route(HttpRequest* req, HttpResponse* res, void* dlib, voi
 		yuarel_parse_query((char*)req->getQueryStr().data(), req->getQueryStr().size(), params, 1);
 		std::vector<TeBkUmLpqWorld> msg;
 		queriesMulti(params[0].val, params[0].val_len, msg);
-		res->setContent(JSONSerialize::serializeUnknown(&msg, 100, "std::vector<TeBkUmLpqWorld>"));
+		JSONSerialize::serializeUnknown(&msg, 100, "std::vector<TeBkUmLpqWorld>", res->getContentP());
 		res->setContentType(ContentTypes::CONTENT_TYPE_APPLICATION_JSON);
 		res->setHTTPResponseStatus(HTTPResponseStatus::Ok);
 	} else if(StringUtil::endsWith(path, "/fortunes")) {
@@ -465,7 +474,7 @@ bool TeBkUmLpqRouter::route(HttpRequest* req, HttpResponse* res, void* dlib, voi
 		yuarel_parse_query((char*)req->getQueryStr().data(), req->getQueryStr().size(), params, 1);
 		std::vector<TeBkUmLpqWorld> msg;
 		updates(params[0].val, params[0].val_len, msg);
-		res->setContent(JSONSerialize::serializeUnknown(&msg, 100, "std::vector<TeBkUmLpqWorld>"));
+		JSONSerialize::serializeUnknown(&msg, 100, "std::vector<TeBkUmLpqWorld>", res->getContentP());
 		res->setContentType(ContentTypes::CONTENT_TYPE_APPLICATION_JSON);
 		res->setHTTPResponseStatus(HTTPResponseStatus::Ok);
 	} else if(StringUtil::endsWith(path, "/updates")) {
@@ -473,7 +482,7 @@ bool TeBkUmLpqRouter::route(HttpRequest* req, HttpResponse* res, void* dlib, voi
 		yuarel_parse_query((char*)req->getQueryStr().data(), req->getQueryStr().size(), params, 1);
 		std::vector<TeBkUmLpqWorld> msg;
 		updatesMulti(params[0].val, params[0].val_len, msg);
-		res->setContent(JSONSerialize::serializeUnknown(&msg, 100, "std::vector<TeBkUmLpqWorld>"));
+		JSONSerialize::serializeUnknown(&msg, 100, "std::vector<TeBkUmLpqWorld>", res->getContentP());
 		res->setContentType(ContentTypes::CONTENT_TYPE_APPLICATION_JSON);
 		res->setHTTPResponseStatus(HTTPResponseStatus::Ok);
 	} else if(StringUtil::endsWith(path, "/cached-worlds")) {
@@ -481,7 +490,7 @@ bool TeBkUmLpqRouter::route(HttpRequest* req, HttpResponse* res, void* dlib, voi
 		yuarel_parse_query((char*)req->getQueryStr().data(), req->getQueryStr().size(), params, 1);
 		std::vector<TeBkUmLpqWorld> msg;
 		cachedWorlds(params[0].val, params[0].val_len, msg);
-		res->setContent(JSONSerialize::serializeUnknown(&msg, 100, "std::vector<TeBkUmLpqWorld>"));
+		JSONSerialize::serializeUnknown(&msg, 100, "std::vector<TeBkUmLpqWorld>", res->getContentP());
 		res->setContentType(ContentTypes::CONTENT_TYPE_APPLICATION_JSON);
 		res->setHTTPResponseStatus(HTTPResponseStatus::Ok);
 	} else {

+ 5 - 5
frameworks/C++/ffead-cpp/te-benchmark-um/src/TeBkUm.cpp

@@ -243,7 +243,7 @@ bool TeBkUmRouter::route(HttpRequest* req, HttpResponse* res, void* dlib, void*
 		//t.start();
 		TeBkUmMessage msg;
 		msg.setMessage(HELLO_WORLD);
-		res->setContent(JSONSerialize::serializeUnknown(&msg, 0, "TeBkUmMessage"));
+		JSONSerialize::serializeUnknown(&msg, 0, "TeBkUmMessage", res->getContentP());
 		res->setContentType(ContentTypes::CONTENT_TYPE_APPLICATION_JSON);
 		res->setHTTPResponseStatus(HTTPResponseStatus::Ok);
 		//t.end();
@@ -257,7 +257,7 @@ bool TeBkUmRouter::route(HttpRequest* req, HttpResponse* res, void* dlib, void*
 		//t.end();
 		//CommonUtils::tsContExec += t.timerNanoSeconds();
 		//t.start();
-		res->setContent(JSONSerialize::serializeUnknown(&msg, 0, "TeBkUmWorld"));
+		JSONSerialize::serializeUnknown(&msg, 0, "TeBkUmWorld", res->getContentP());
 		res->setContentType(ContentTypes::CONTENT_TYPE_APPLICATION_JSON);
 		res->setHTTPResponseStatus(HTTPResponseStatus::Ok);
 		//t.end();
@@ -273,7 +273,7 @@ bool TeBkUmRouter::route(HttpRequest* req, HttpResponse* res, void* dlib, void*
 		//t.end();
 		//CommonUtils::tsContExec += t.timerNanoSeconds();
 		//t.start();
-		res->setContent(JSONSerialize::serializeUnknown(&msg, 100, "std::vector<TeBkUmWorld>"));
+		JSONSerialize::serializeUnknown(&msg, 100, "std::vector<TeBkUmWorld>", res->getContentP());
 		res->setContentType(ContentTypes::CONTENT_TYPE_APPLICATION_JSON);
 		res->setHTTPResponseStatus(HTTPResponseStatus::Ok);
 		//t.end();
@@ -303,7 +303,7 @@ bool TeBkUmRouter::route(HttpRequest* req, HttpResponse* res, void* dlib, void*
 		//t.end();
 		//CommonUtils::tsContExec += t.timerNanoSeconds();
 		//t.start();
-		res->setContent(JSONSerialize::serializeUnknown(&msg, 100, "std::vector<TeBkUmWorld>"));
+		JSONSerialize::serializeUnknown(&msg, 100, "std::vector<TeBkUmWorld>", res->getContentP());
 		res->setContentType(ContentTypes::CONTENT_TYPE_APPLICATION_JSON);
 		res->setHTTPResponseStatus(HTTPResponseStatus::Ok);
 		//t.end();
@@ -319,7 +319,7 @@ bool TeBkUmRouter::route(HttpRequest* req, HttpResponse* res, void* dlib, void*
 		//t.end();
 		//CommonUtils::tsContExec += t.timerNanoSeconds();
 		//t.start();
-		res->setContent(JSONSerialize::serializeUnknown(&msg, 100, "std::vector<TeBkUmWorld>"));
+		JSONSerialize::serializeUnknown(&msg, 100, "std::vector<TeBkUmWorld>", res->getContentP());
 		res->setContentType(ContentTypes::CONTENT_TYPE_APPLICATION_JSON);
 		res->setHTTPResponseStatus(HTTPResponseStatus::Ok);
 		//t.end();