Skip to content

Commit

Permalink
chore(bindings/nodejs): add deno benchmark (#1814)
Browse files Browse the repository at this point in the history
* chore(bindings/nodejs): add deno benchmark

* add env

* update .env.example

* add license headers

* run format
  • Loading branch information
promer94 authored Mar 31, 2023
1 parent ef069a2 commit 80acbe5
Show file tree
Hide file tree
Showing 5 changed files with 131 additions and 1 deletion.
5 changes: 5 additions & 0 deletions bindings/nodejs/.env.example
Original file line number Diff line number Diff line change
@@ -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=
115 changes: 115 additions & 0 deletions bindings/nodejs/benchmark/deno.ts
Original file line number Diff line number Diff line change
@@ -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))
},
)
})
File renamed without changes.
4 changes: 3 additions & 1 deletion bindings/nodejs/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand All @@ -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": {
Expand Down
8 changes: 8 additions & 0 deletions bindings/nodejs/yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit 80acbe5

Please sign in to comment.