bindings/nodejs/benchmark/node.js (85 lines of code) (raw):

/* * 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. */ const { Operator } = require('../index.js') const { S3Client, PutObjectCommand, GetObjectCommand } = require('@aws-sdk/client-s3') const { suite, add, cycle, complete } = require('benny') const crypto = require('node:crypto') const endpoint = process.env.AWS_S3_ENDPOINT const region = process.env.AWS_S3_REGION const accessKeyId = process.env.AWS_ACCESS_KEY_ID const secretAccessKey = process.env.AWS_SECRET_ACCESS_KEY const bucket = process.env.AWS_BUCKET const opendalClient = new Operator('s3', { root: '/', bucket, endpoint, }) const s3Client = new S3Client({ endpoint, region, credentials: { accessKeyId, secretAccessKey, }, }) const testCases = [ { name: '4kb', content: Buffer.alloc(4 * 1024, 'opendal', 'utf8') }, { name: '256kb', content: Buffer.alloc(256 * 1024, 'opendal', 'utf8') }, { name: '4mb', content: Buffer.alloc(4 * 1024 * 1024, 'opendal', 'utf8') }, { name: '16mb', content: Buffer.alloc(16 * 1024 * 1024, 'opendal', 'utf8') }, ] async function benchRead() { const uuid = crypto.randomUUID() await testCases .map((v) => async () => { const filename = `${uuid}_${v.name}_read_bench.txt` await opendalClient.write(filename, v.content) return suite( `read (${v.name})`, add(`opendal read (${v.name})`, async () => { await opendalClient.read(filename).then((v) => v.toString('utf-8')) }), add(`s3 read (${v.name})`, async () => { const command = new GetObjectCommand({ Key: filename, Bucket: bucket, }) await s3Client.send(command).then((v) => v.Body.transformToString('utf-8')) }), cycle(), complete(), ) }) .reduce((p, v) => p.then(() => v()), Promise.resolve()) } async function benchWrite() { const uuid = crypto.randomUUID() await testCases .map( (v) => () => suite( `write (${v.name})`, add(`opendal write (${v.name})`, async () => { let count = 0 return async () => opendalClient.write(`${uuid}_${count++}_${v.name}_opendal.txt`, v.content) }), add(`s3 write (${v.name})`, async () => { let count = 0 return async () => { const command = new PutObjectCommand({ Bucket: bucket, Key: `${uuid}_${count++}_${v.name}_s3.txt`, Body: v.content, }) await s3Client.send(command) } }), cycle(), complete(), ), ) .reduce((p, v) => p.then(() => v()), Promise.resolve()) } async function bench() { await benchRead() await benchWrite() } bench()