Browse Source

Add Dart 3 example (#9197)

* port dart2 implementation

* somehow stable version of dart in docker is not 3.5.0 yet, reverting pubspec and dockerfile

* general code clean up

* update dockerfile

* update server binding

* change InternetAddress in binging to string

* re-bump to dart 3.5

* fix error in server.dart

* rename Containerfile as dart3.dockerfile

---------

Co-authored-by: Francesco Iapicca <[email protected]>
Francesco Iapicca 1 year ago
parent
commit
2e05f43beb

+ 9 - 0
frameworks/Dart/dart3/.dockerignore

@@ -0,0 +1,9 @@
+# From https://hub.docker.com/_/dart
+.dockerignore
+Dockerfile
+build/
+.dart_tool/
+.git/
+.github/
+.gitignore
+.packages

+ 5 - 0
frameworks/Dart/dart3/.gitignore

@@ -0,0 +1,5 @@
+# https://dart.dev/guides/libraries/private-files
+# Created by `dart pub`
+.dart_tool/
+*.lock
+!bin

+ 22 - 0
frameworks/Dart/dart3/README.md

@@ -0,0 +1,22 @@
+# Dart 3 Benchmarking Test
+
+### Test Type Implementation Source Code
+
+- [JSON](server.dart)
+- [PLAINTEXT](server.dart)
+
+## Important Libraries
+
+The tests were run with:
+
+- [Dart v3.4.4](https://dart.dev/)
+
+## Test URLs
+
+### JSON
+
+http://localhost:8080/json
+
+### PLAINTEXT
+
+http://localhost:8080/plaintext

+ 1 - 0
frameworks/Dart/dart3/analysis_options.yaml

@@ -0,0 +1 @@
+include: package:lints/recommended.yaml

+ 26 - 0
frameworks/Dart/dart3/benchmark_config.json

@@ -0,0 +1,26 @@
+{
+  "framework": "dart3",
+  "tests": [
+    {
+      "default": {
+        "json_url": "/json",
+        "plaintext_url": "/plaintext",
+        "port": 8080,
+        "approach": "Stripped",
+        "classification": "Platform",
+        "database": "None",
+        "framework": "None",
+        "language": "Dart",
+        "flavor": "None",
+        "orm": "None",
+        "platform": "None",
+        "webserver": "None",
+        "os": "Linux",
+        "database_os": "Linux",
+        "display_name": "dart3",
+        "notes": "",
+        "versus": "None"
+      }
+    }
+  ]
+}

+ 89 - 0
frameworks/Dart/dart3/bin/server.dart

@@ -0,0 +1,89 @@
+import 'dart:convert';
+import 'dart:io';
+import 'dart:isolate';
+
+final _encoder = JsonUtf8Encoder();
+
+void main(List<String> _) async {
+  /// Create an [Isolate] containinig an [HttpServer]
+  /// for each processor after the first
+  for (var i = 1; i < Platform.numberOfProcessors; i++) {
+    await Isolate.spawn(_startServer, _);
+  }
+
+  /// Create a [HttpServer] for the first processor
+  await _startServer(_);
+}
+
+/// Creates and setup a [HttpServer]
+Future<void> _startServer(List<String> _) async {
+  /// Binds the [HttpServer] on `0.0.0.0:8080`.
+  final server = await HttpServer.bind(
+    InternetAddress('0.0.0.0', type: InternetAddressType.IPv4),
+    8080,
+    shared: true,
+  );
+
+  /// Sets [HttpServer]'s [serverHeader].
+  server
+    ..defaultResponseHeaders.clear()
+    ..serverHeader = 'dart';
+
+  /// Handles [HttpRequest]'s from [HttpServer].
+  await for (final request in server) {
+    switch (request.uri.path) {
+      case '/json':
+        _jsonTest(request);
+        break;
+      case '/plaintext':
+        _plaintextTest(request);
+        break;
+      default:
+        _sendResponse(request, HttpStatus.notFound);
+    }
+  }
+}
+
+/// Completes the given [request] by writing the [bytes] with the given
+/// [statusCode] and [type].
+void _sendResponse(
+  HttpRequest request,
+  int statusCode, {
+  ContentType? type,
+  List<int> bytes = const [],
+}) =>
+    request.response
+      ..statusCode = statusCode
+      ..headers.contentType = type
+      ..headers.date = DateTime.now()
+      ..contentLength = bytes.length
+      ..add(bytes)
+      ..close();
+
+/// Completes the given [request] by writing the [response] as JSON.
+void _sendJson(HttpRequest request, Object response) => _sendResponse(
+      request,
+      HttpStatus.ok,
+      type: ContentType.json,
+      bytes: _encoder.convert(response),
+    );
+
+/// Completes the given [request] by writing the [response] as plain text.
+void _sendText(HttpRequest request, String response) => _sendResponse(
+      request,
+      HttpStatus.ok,
+      type: ContentType.text,
+      bytes: utf8.encode(response),
+    );
+
+/// Responds with the JSON test to the [request].
+void _jsonTest(HttpRequest request) => _sendJson(
+      request,
+      const {'message': 'Hello, World!'},
+    );
+
+/// Responds with the plaintext test to the [request].
+void _plaintextTest(HttpRequest request) => _sendText(
+      request,
+      'Hello, World!',
+    );

+ 14 - 0
frameworks/Dart/dart3/dart3.dockerfile

@@ -0,0 +1,14 @@
+
+FROM dart:3.5 AS builder
+
+COPY . /app
+WORKDIR /app
+RUN mkdir build
+RUN dart compile exe ./bin/server.dart -o build/server
+
+FROM scratch
+COPY --from=builder /runtime/ /
+COPY --from=builder /app/build /bin
+
+EXPOSE 8080
+CMD ["server"]

+ 7 - 0
frameworks/Dart/dart3/pubspec.yaml

@@ -0,0 +1,7 @@
+name: dartbenchmark
+description: A benchmark of dart
+environment:
+  sdk: '>=3.5.0 <4.0.0'
+
+dev_dependencies:
+  lints: ^4.0.0