You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@opendal.apache.org by xu...@apache.org on 2023/03/31 04:08:01 UTC

[incubator-opendal] branch main updated: chore(bindings/nodejs): add deno benchmark (#1814)

This is an automated email from the ASF dual-hosted git repository.

xuanwo pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-opendal.git


The following commit(s) were added to refs/heads/main by this push:
     new 80acbe5a chore(bindings/nodejs): add deno benchmark (#1814)
80acbe5a is described below

commit 80acbe5ad3b2e9a71a8922bc67c4aeb7cac489da
Author: Yixuan Xu <yi...@outlook.com>
AuthorDate: Fri Mar 31 12:07:57 2023 +0800

    chore(bindings/nodejs): add deno benchmark (#1814)
    
    * chore(bindings/nodejs): add deno benchmark
    
    * add env
    
    * update .env.example
    
    * add license headers
    
    * run format
---
 bindings/nodejs/.env.example                    |   5 ++
 bindings/nodejs/benchmark/deno.ts               | 115 ++++++++++++++++++++++++
 bindings/nodejs/benchmark/{index.js => node.js} |   0
 bindings/nodejs/package.json                    |   4 +-
 bindings/nodejs/yarn.lock                       |   8 ++
 5 files changed, 131 insertions(+), 1 deletion(-)

diff --git a/bindings/nodejs/.env.example b/bindings/nodejs/.env.example
new file mode 100644
index 00000000..88f75b60
--- /dev/null
+++ b/bindings/nodejs/.env.example
@@ -0,0 +1,5 @@
+export AWS_ACCESS_KEY_ID=
+export AWS_SECRET_ACCESS_KEY=
+export AWS_S3_REGION=
+export AWS_S3_ENDPOINT=
+export AWS_BUCKET=
\ No newline at end of file
diff --git a/bindings/nodejs/benchmark/deno.ts b/bindings/nodejs/benchmark/deno.ts
new file mode 100644
index 00000000..f14f167a
--- /dev/null
+++ b/bindings/nodejs/benchmark/deno.ts
@@ -0,0 +1,115 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { Operator } from 'npm:opendal'
+import 'https://deno.land/std@0.181.0/dotenv/load.ts'
+import { S3Client } from 'https://deno.land/x/s3_lite_client@0.5.0/mod.ts'
+
+const endpoint = Deno.env.get('AWS_S3_ENDPOINT') || 'http://localhost:9000'
+const url = new URL(endpoint)
+const port = url.port ? parseInt(url.port) : 9000
+const hostname = url.hostname
+const bucket = Deno.env.get('AWS_BUCKET') || 'benchmark'
+
+const s3 = new S3Client({
+  endPoint: hostname,
+  useSSL: false,
+  port: port,
+  region: Deno.env.get('AWS_REGION') || 'us-east-1',
+  bucket,
+  accessKey: Deno.env.get('AWS_ACCESS_KEY_ID'),
+  secretKey: Deno.env.get('AWS_SECRET_ACCESS_KEY'),
+})
+
+const opendal = new Operator('s3', {
+  root: '/',
+  bucket,
+  endpoint,
+})
+
+const files = [
+  {
+    name: '4kb',
+    file: new Uint8Array(4 * 1024),
+  },
+  {
+    name: '256kb',
+    file: new Uint8Array(256 * 1024),
+  },
+  {
+    name: '4mb',
+    file: new Uint8Array(4 * 1024 * 1024),
+  },
+  {
+    name: '16mb',
+    file: new Uint8Array(16 * 1024 * 1024),
+  },
+]
+
+const textDecoder = new TextDecoder()
+const filenams = await Promise.all(
+  files.map(async (data) => {
+    const filename = `${crypto.randomUUID()}-${data.name}-read-bench`
+    await s3.putObject(filename, textDecoder.decode(data.file))
+    return filename
+  }),
+)
+files.map((data, i) => {
+  Deno.bench(
+    `opendal: read ${data.name}`,
+    {
+      group: `read ${data.name}`,
+    },
+    async () => {
+      await opendal.read(filenams[i])
+    },
+  )
+  Deno.bench(
+    `s3: read ${data.name}`,
+    {
+      group: `read ${data.name}`,
+    },
+    async () => {
+      await s3.getObject(filenams[i])
+    },
+  )
+})
+
+files.map((data) => {
+  Deno.bench(
+    `s3: write ${data.name}`,
+    {
+      group: `write ${data.name}`,
+    },
+    async () => {
+      const filename = `${crypto.randomUUID()}-${data.name}}-s3`
+      await s3.putObject(filename, textDecoder.decode(data.file))
+    },
+  )
+  Deno.bench(
+    `opendal: write ${data.name}`,
+    {
+      group: `write ${data.name}`,
+    },
+    async () => {
+      const filename = `${crypto.randomUUID()}-${data.name}}-opendal`
+      await opendal.write(filename, textDecoder.decode(data.file))
+    },
+  )
+})
diff --git a/bindings/nodejs/benchmark/index.js b/bindings/nodejs/benchmark/node.js
similarity index 100%
rename from bindings/nodejs/benchmark/index.js
rename to bindings/nodejs/benchmark/node.js
diff --git a/bindings/nodejs/package.json b/bindings/nodejs/package.json
index ab1cdb7a..8afe648f 100644
--- a/bindings/nodejs/package.json
+++ b/bindings/nodejs/package.json
@@ -51,6 +51,7 @@
     "@swc/core": "^1.3.38",
     "@types/node": "^18.14.5",
     "benny": "^3.7.1",
+    "dotenv": "^16.0.3",
     "prettier": "^2.8.4",
     "typedoc": "^0.23.28",
     "typescript": "^5.0.2"
@@ -66,7 +67,8 @@
     "format": "prettier --write .",
     "prepublishOnly": "napi prepublish -t npm",
     "test": "cucumber-js",
-    "bench": "node ./benchmark/index.js",
+    "bench": "node -r dotenv/config ./benchmark/node.js dotenv_config_path=./.env",
+    "bench:deno": "deno bench ./benchmark/deno.ts --reload=npm:opendal --allow-read --allow-ffi --allow-net --allow-env",
     "version": "napi version"
   },
   "prettier": {
diff --git a/bindings/nodejs/yarn.lock b/bindings/nodejs/yarn.lock
index 2e18e3f4..67e976c9 100644
--- a/bindings/nodejs/yarn.lock
+++ b/bindings/nodejs/yarn.lock
@@ -1814,6 +1814,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"dotenv@npm:^16.0.3":
+  version: 16.0.3
+  resolution: "dotenv@npm:16.0.3"
+  checksum: afcf03f373d7a6d62c7e9afea6328e62851d627a4e73f2e12d0a8deae1cd375892004f3021883f8aec85932cd2834b091f568ced92b4774625b321db83b827f8
+  languageName: node
+  linkType: hard
+
 "emoji-regex@npm:^8.0.0":
   version: 8.0.0
   resolution: "emoji-regex@npm:8.0.0"
@@ -2238,6 +2245,7 @@ __metadata:
     "@swc/core": ^1.3.38
     "@types/node": ^18.14.5
     benny: ^3.7.1
+    dotenv: ^16.0.3
     prettier: ^2.8.4
     typedoc: ^0.23.28
     typescript: ^5.0.2