diff --git a/benchmark/grapheme/perf-porffor.js b/benchmark/grapheme/perf-porffor.js new file mode 100644 index 0000000..9feafab --- /dev/null +++ b/benchmark/grapheme/perf-porffor.js @@ -0,0 +1,41 @@ +import * as path from 'node:path'; +import { build } from 'esbuild'; +import { $ } from 'zx'; + +let baseDir = import.meta.dirname; + +let libs = [ + ['unicode-segmenter/grapheme', 'perf-porffor/unicode-segmenter.js'], + ['graphemer', 'perf-porffor/graphemer.js'], + ['grapheme-splitter', 'perf-porffor/grapheme-splitter.js'], +]; + +let benches = []; + +for (let lib of libs) { + let libName = lib[0]; + let libEntry = path.join(baseDir, lib[1]); + + let bundleEntry = libEntry.replace(/\.js$/, '.bundle.js'); + + await build({ + write: true, + bundle: true, + format: 'esm', + entryPoints: [libEntry], + outfile: bundleEntry, + }); + + benches.push({ + libName, + libEntry, + bundleEntry, + }); +} + +console.log('\nExecuting Porffor benchmark...\n'); + +for (let bench of benches) { + console.log(`--- ${bench.libName} ---\n`); + await $({ stdio: 'inherit' })`yarn porf ${bench.bundleEntry}`; +} diff --git a/benchmark/grapheme/perf-porffor/grapheme-splitter.js b/benchmark/grapheme/perf-porffor/grapheme-splitter.js new file mode 100644 index 0000000..08b660b --- /dev/null +++ b/benchmark/grapheme/perf-porffor/grapheme-splitter.js @@ -0,0 +1,26 @@ +import { inputs, simpleBench } from '../../_simple-bench.js'; + +import { GraphemeSplitter } from '../bundle-entries/grapheme-splitter.js'; +let graphemeSplitter = new (GraphemeSplitter.default || GraphemeSplitter)(); + +{ + let result = simpleBench(1000, () => { + void [...graphemeSplitter.iterateGraphemes(inputs.small)]; + }); + + console.log(`grapheme-splitter (small input)`); + console.log(`samples: ${result.samples}`); + console.log(`duration (avg): ${result.avgDuration}`); + console.log(); +} + +{ + let result = simpleBench(1000, () => { + void [...graphemeSplitter.iterateGraphemes(inputs.medium)]; + }); + + console.log(`grapheme-splitter (medium input)`); + console.log(`samples: ${result.samples}`); + console.log(`duration (avg): ${result.avgDuration}`); + console.log(); +} diff --git a/benchmark/grapheme/perf-porffor/graphemer.js b/benchmark/grapheme/perf-porffor/graphemer.js new file mode 100644 index 0000000..c33f145 --- /dev/null +++ b/benchmark/grapheme/perf-porffor/graphemer.js @@ -0,0 +1,27 @@ +import { inputs, simpleBench } from '../../_simple-bench.js'; + +import { Graphemer } from '../bundle-entries/graphemer.js'; +let graphemer = new (Graphemer.default || Graphemer)(); + +{ + let result = simpleBench(1000, () => { + void [...graphemer.iterateGraphemes(inputs.small)]; + }); + + console.log(`graphemer (small input)`); + console.log(`samples: ${result.samples}`); + console.log(`duration (avg): ${result.avgDuration}`); + console.log(); +} + + +{ + let result = simpleBench(1000, () => { + void [...graphemer.iterateGraphemes(inputs.medium)]; + }); + + console.log(`graphemer (medium input)`); + console.log(`samples: ${result.samples}`); + console.log(`duration (avg): ${result.avgDuration}`); + console.log(); +} diff --git a/benchmark/grapheme/perf-porffor/unicode-segmenter.js b/benchmark/grapheme/perf-porffor/unicode-segmenter.js new file mode 100644 index 0000000..00e8621 --- /dev/null +++ b/benchmark/grapheme/perf-porffor/unicode-segmenter.js @@ -0,0 +1,25 @@ +import { inputs, simpleBench } from '../../_simple-bench.js'; + +import { graphemeSegments } from '../bundle-entries/unicode-segmenter.js'; + +{ + let result = simpleBench(10000, () => { + void [...graphemeSegments(inputs.small)]; + }); + + console.log(`unicode-segmenter/grapheme (small input)`); + console.log(`samples: ${result.samples}`); + console.log(`duration (avg): ${result.avgDuration}`); + console.log(); +} + +{ + let result = simpleBench(10000, () => { + void [...graphemeSegments(inputs.medium)]; + }); + + console.log(`unicode-segmenter/grapheme (medium input)`); + console.log(`samples: ${result.samples}`); + console.log(`medium input (avg): ${result.avgDuration}`); + console.log(); +} diff --git a/package.json b/package.json index ac7a802..3ea8651 100644 --- a/package.json +++ b/package.json @@ -107,7 +107,8 @@ "perf:grapheme": "node --expose-gc benchmark/grapheme/perf.js", "perf:grapheme:browser": "vite -c benchmark/grapheme/vite.config.js", "perf:grapheme:hermes": "node benchmark/grapheme/perf-hermes.js", - "perf:grapheme:quickjs": "node benchmark/grapheme/perf-quickjs.js" + "perf:grapheme:quickjs": "node benchmark/grapheme/perf-quickjs.js", + "perf:grapheme:porffor": "node benchmark/grapheme/perf-porffor" }, "alias": { "process": false @@ -131,6 +132,7 @@ "metro": "^0.82.0", "mitata": "^1.0.34", "os-browserify": "^0.3.0", + "porffor": "^0.56.0", "pretty-bytes": "^6.1.1", "rimraf": "^6.0.1", "typescript": "^5.7.3", diff --git a/yarn.lock b/yarn.lock index 04f7c87..a53ef75 100644 --- a/yarn.lock +++ b/yarn.lock @@ -263,7 +263,7 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.24.7, @babel/parser@npm:^7.25.3, @babel/parser@npm:^7.25.9, @babel/parser@npm:^7.26.9": +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.24.4, @babel/parser@npm:^7.24.7, @babel/parser@npm:^7.25.3, @babel/parser@npm:^7.25.9, @babel/parser@npm:^7.26.9": version: 7.26.9 resolution: "@babel/parser@npm:7.26.9" dependencies: @@ -1872,12 +1872,12 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.4.0, acorn@npm:^8.8.2": - version: 8.14.0 - resolution: "acorn@npm:8.14.0" +"acorn@npm:^8.14.0, acorn@npm:^8.4.0, acorn@npm:^8.8.2": + version: 8.14.1 + resolution: "acorn@npm:8.14.1" bin: acorn: bin/acorn - checksum: 10c0/6d4ee461a7734b2f48836ee0fbb752903606e576cc100eb49340295129ca0b452f3ba91ddd4424a1d4406a98adfb2ebb6bd0ff4c49d7a0930c10e462719bbfd7 + checksum: 10c0/dbd36c1ed1d2fa3550140000371fcf721578095b18777b85a79df231ca093b08edc6858d75d6e48c73e431c174dcf9214edbd7e6fa5911b93bd8abfa54e47123 languageName: node linkType: hard @@ -2932,6 +2932,13 @@ __metadata: languageName: node linkType: hard +"hermes-estree@npm:0.18.2": + version: 0.18.2 + resolution: "hermes-estree@npm:0.18.2" + checksum: 10c0/6f3f53b8c9b48d75e682644eff1a35934d755df5532092c0248e1e59c305e55fceffc2396ac65377585ddeacc17cd7a3f0d2264565350661e13aa00a7c70b7d6 + languageName: node + linkType: hard + "hermes-estree@npm:0.25.1": version: 0.25.1 resolution: "hermes-estree@npm:0.25.1" @@ -2948,6 +2955,15 @@ __metadata: languageName: node linkType: hard +"hermes-parser@npm:^0.18.2": + version: 0.18.2 + resolution: "hermes-parser@npm:0.18.2" + dependencies: + hermes-estree: "npm:0.18.2" + checksum: 10c0/d06f79064448cc9240d00115083a9f0a795078b493f275b2bfe39ead0039dc7e6f13c1f8bc0027c1293779269212e008402365df59a9f2fdaa5e45fa4a515818 + languageName: node + linkType: hard + "http-cache-semantics@npm:^4.1.1": version: 4.1.1 resolution: "http-cache-semantics@npm:4.1.1" @@ -3533,6 +3549,13 @@ __metadata: languageName: node linkType: hard +"meriyah@npm:^4.3.9": + version: 4.5.0 + resolution: "meriyah@npm:4.5.0" + checksum: 10c0/184c9618a692d9a093c44d1fd8da66ec45035a5dd82574525560209356b200d7106155ad9773deaeaece564d250369fc6d2a4f9e4913221b2c145b3db1aac308 + languageName: node + linkType: hard + "metro-babel-transformer@npm:0.82.0": version: 0.82.0 resolution: "metro-babel-transformer@npm:0.82.0" @@ -3988,6 +4011,13 @@ __metadata: languageName: node linkType: hard +"node-repl-polyfill@github:CanadaHonk/node-repl-polyfill": + version: 0.1.1 + resolution: "node-repl-polyfill@https://github.com/CanadaHonk/node-repl-polyfill.git#commit=8d8a080a72971fefd822f41463d569a680632e3d" + checksum: 10c0/b559512406b40d27580819350c2c298090de4387e66955e9e4425bd86546d2aa8f992d5b9089bc0546e1e5502051e1e036dbf3d159af347caae81be122be3446 + languageName: node + linkType: hard + "nopt@npm:^7.0.0": version: 7.2.0 resolution: "nopt@npm:7.2.0" @@ -4243,6 +4273,28 @@ __metadata: languageName: node linkType: hard +"porffor@npm:^0.56.0": + version: 0.56.0 + resolution: "porffor@npm:0.56.0" + dependencies: + "@babel/parser": "npm:^7.24.4" + acorn: "npm:^8.14.0" + hermes-parser: "npm:^0.18.2" + meriyah: "npm:^4.3.9" + node-repl-polyfill: "github:CanadaHonk/node-repl-polyfill" + dependenciesMeta: + "@babel/parser": + optional: true + hermes-parser: + optional: true + meriyah: + optional: true + bin: + porf: runner/index.js + checksum: 10c0/6ccc4aa560e27fb8243dd07f5688fe2c992437923916a2cd1c0dfd29cbedbd5b1fbd2e7351efd7829f51eb1a17afd1961a4d2ce4199b8859d291976cd53f5151 + languageName: node + linkType: hard + "postcss@npm:^8.5.3": version: 8.5.3 resolution: "postcss@npm:8.5.3" @@ -5020,6 +5072,7 @@ __metadata: metro: "npm:^0.82.0" mitata: "npm:^1.0.34" os-browserify: "npm:^0.3.0" + porffor: "npm:^0.56.0" pretty-bytes: "npm:^6.1.1" rimraf: "npm:^6.0.1" typescript: "npm:^5.7.3"