From c0c9b7c9b41b0c7582a5ca25fa28b4042190f498 Mon Sep 17 00:00:00 2001 From: Anton Nesterov Date: Tue, 27 Aug 2024 16:35:17 +0200 Subject: [PATCH] [feat] prep for cffi Signed-off-by: Anton Nesterov --- binding/makefile | 5 ++++ dal/__test__/bench.node.cjs | 34 +++++++++++++++---------- dal/bun.ffi.ts | 41 +++++++++++++++++++++++++++++++ dal/{CBuilder.ts => node.napi.ts} | 0 tsconfig.json | 2 +- 5 files changed, 68 insertions(+), 14 deletions(-) create mode 100644 binding/makefile create mode 100644 dal/bun.ffi.ts rename dal/{CBuilder.ts => node.napi.ts} (100%) diff --git a/binding/makefile b/binding/makefile new file mode 100644 index 0000000..18f569f --- /dev/null +++ b/binding/makefile @@ -0,0 +1,5 @@ +build-lib: + CGO_ENABLED=1 GOOS=darwin GOARCH=arm64 go build -o ../lib/libdal-arm64.dylib -buildmode=c-shared ./dal.go + for arch in amd64 arm64; do\ + CC=x86_64-unknown-linux-gnu-gcc CGO_ENABLED=1 GOOS=linux GOARCH=$${arch} go build -o ../lib/libdal-$${arch}.so -buildmode=c-shared ./dal.go;\ + done \ No newline at end of file diff --git a/dal/__test__/bench.node.cjs b/dal/__test__/bench.node.cjs index 0953d4e..ded5e27 100644 --- a/dal/__test__/bench.node.cjs +++ b/dal/__test__/bench.node.cjs @@ -1,6 +1,8 @@ const fs = require("fs"); const dal = require("../../build/Release/dal.node"); +const Mb = (num) => Math.round(num / 1024 / 1024); + class Stats { constructor() { this.calls = 0; @@ -26,37 +28,42 @@ class Stats { print() { console.log(` AVERAGE: -rss: ${mb(this.avg_rss)} Mb -external: ${mb(this.avg_external)} Mb -buffers: ${mb(this.avg_heapUsed)} Mb -total: ${mb(this.avg_heapTotal)} Mb`); +rss: ${Mb(this.avg_rss)} Mb +external: ${Mb(this.avg_external)} Mb +buffers: ${Mb(this.avg_heapUsed)} Mb +total: ${Mb(this.avg_heapTotal)} Mb`); } } + + const stats = new Stats(); let prevMem = process.memoryUsage(); stats.add(prevMem); -const mb = (num) => Math.round(num / 1024 / 1024); + + function MEM(when = "") { const mem = process.memoryUsage(); stats.add(mem); console.log(` ${when} -rss: ${mb(mem.rss)} Mb [delta> ${mem.rss - prevMem.rss}] -external: ${mb(mem.external)} Mb [delta> ${mem.external - prevMem.external}] -buffers: ${mb(mem.heapUsed)} Mb [delta> ${mem.heapUsed - prevMem.heapUsed}] -total: ${mb(mem.heapTotal)} Mb [delta> ${mem.heapTotal - prevMem.heapTotal}]`); +rss: ${Mb(mem.rss)} Mb [delta> ${mem.rss - prevMem.rss}] +external: ${Mb(mem.external)} Mb [delta> ${mem.external - prevMem.external}] +buffers: ${Mb(mem.heapUsed)} Mb [delta> ${mem.heapUsed - prevMem.heapUsed}] +total: ${Mb(mem.heapTotal)} Mb [delta> ${mem.heapTotal - prevMem.heapTotal}]`); } + console.time("Time to end"); MEM("START"); const buf = fs.readFileSync("./pkg/__test__/proto_test.msgpack"); -const iter = dal.RowIterator(buf); +const Iterator = dal.RowIterator(buf); MEM("AFTER INIT"); + let dataTransferedBytes = 0; for (let i = 0; i < 100000000; i++) { - const b = iter.next(); + const b = Iterator.next(); if (b.length === 0) { break; } @@ -68,11 +75,12 @@ for (let i = 0; i < 100000000; i++) { MEM("AFTER ITERATION"); -iter.free(); +Iterator.free(); MEM("AFTER CLEANUP"); -console.log("\nData transfered: ", mb(dataTransferedBytes), "Mb"); +console.log("\nData transfered: ", Mb(dataTransferedBytes), "Mb"); console.timeEnd("Time to end"); + setTimeout(() => { MEM("AFTER SOME TIME"); stats.avg(); diff --git a/dal/bun.ffi.ts b/dal/bun.ffi.ts new file mode 100644 index 0000000..4d4632d --- /dev/null +++ b/dal/bun.ffi.ts @@ -0,0 +1,41 @@ +import { dlopen, FFIType, suffix, ptr } from "bun:ffi"; +import { join } from "node:path"; +import fs from "node:fs"; + +// TODO: build a shared library compatible with cffi +const libname = `libdal-arm64.${suffix}`; +const libpath = join(__dirname, '..', 'lib', libname); + +const { + symbols: { + InitSQLite, + CreateRowIterator, + NextRow, + GetLen, + FreeIter, + }, + } = dlopen( + libpath, + { + InitSQLite: { + args: [ FFIType.cstring ], + returns: FFIType.void, + }, + CreateRowIterator: { + args: [ FFIType.cstring ], + returns: FFIType.i32, + }, + NextRow: { + args: [FFIType.i32], + returns: FFIType.cstring, + }, + GetLen: { + args: [FFIType.i32], + returns: FFIType.i32, + }, + FreeIter : { + args: [FFIType.i32], + returns: FFIType.void, + }, + }, + ); diff --git a/dal/CBuilder.ts b/dal/node.napi.ts similarity index 100% rename from dal/CBuilder.ts rename to dal/node.napi.ts diff --git a/tsconfig.json b/tsconfig.json index 0a9d61b..39a7800 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,5 +1,5 @@ { - "files": ["dal/index.ts", "dal/Binding.ts"], + "files": ["dal/index.ts", "dal/Binding.ts", "dal/node.napi.ts"], "compilerOptions": { "target": "ESNext", "module": "ESNext",