From 61a84cfc041be1477f2ecb0090e8bac059c05941 Mon Sep 17 00:00:00 2001 From: Christopher Jeffrey Date: Sun, 4 Feb 2024 11:19:35 -0500 Subject: [PATCH] Add string decoding benchmarks --- perf/util.js | 4 +- perf/write-base64.js | 50 ++++++++ perf/write-binary.js | 25 ++++ perf/write-hex.js | 33 ++--- perf/write-ucs2.js | 25 ++++ perf/write-utf8.js | 297 +++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 417 insertions(+), 17 deletions(-) create mode 100644 perf/write-base64.js create mode 100644 perf/write-binary.js create mode 100644 perf/write-ucs2.js create mode 100644 perf/write-utf8.js diff --git a/perf/util.js b/perf/util.js index 5984384e..eb498061 100644 --- a/perf/util.js +++ b/perf/util.js @@ -1,6 +1,6 @@ var benchmark = require('benchmark') -exports.suite = function () { +exports.suite = function (isAsync) { var suite = new benchmark.Suite() process.nextTick(function () { suite @@ -13,7 +13,7 @@ exports.suite = function () { .on('complete', function () { console.log('Fastest is ' + this.filter('fastest').map('name')) }) - .run({ async: true }) + .run({ async: isAsync === undefined ? true : isAsync }) }) return suite } diff --git a/perf/write-base64.js b/perf/write-base64.js new file mode 100644 index 00000000..07421198 --- /dev/null +++ b/perf/write-base64.js @@ -0,0 +1,50 @@ +'use strict' + +var BrowserBuffer = require('../').Buffer // (this module) +var util = require('./util') +var suite1 = util.suite(false) +var suite2 = util.suite(false) +var suite3 = util.suite(false) + +var LENGTH = (8192 * 3) >>> 2 +var browserSubject = BrowserBuffer.alloc(LENGTH) +var nodeSubject = Buffer.alloc(LENGTH) + +var charset = + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' + +var str = '' + +for (var i = 0; i < 8192; i++) { + str += charset[Math.random() * charset.length | 0] +} + +suite1.add('BrowserBuffer.byteLength(' + str.length + ', "base64")', function () { + BrowserBuffer.byteLength(str, 'base64') +}) + +if (!process.browser) { + suite1.add('NodeBuffer.byteLength(' + str.length + ', "base64")', function () { + Buffer.byteLength(str, 'base64') + }) +} + +suite2.add('BrowserBuffer#write(' + str.length + ', "base64")', function () { + browserSubject.write(str, 'base64') +}) + +if (!process.browser) { + suite2.add('NodeBuffer#write(' + str.length + ', "base64")', function () { + nodeSubject.write(str, 'base64') + }) +} + +suite3.add('BrowserBuffer#toString(' + str.length + ', "base64")', function () { + browserSubject.toString('base64') +}) + +if (!process.browser) { + suite3.add('NodeBuffer#toString(' + str.length + ', "base64")', function () { + nodeSubject.toString('base64') + }) +} diff --git a/perf/write-binary.js b/perf/write-binary.js new file mode 100644 index 00000000..ed71a53d --- /dev/null +++ b/perf/write-binary.js @@ -0,0 +1,25 @@ +'use strict' + +var BrowserBuffer = require('../').Buffer // (this module) +var util = require('./util') +var suite = util.suite() + +var LENGTH = 8192 +var browserSubject = BrowserBuffer.alloc(LENGTH) +var nodeSubject = Buffer.alloc(LENGTH) + +var str = '' + +for (var i = 0; i < LENGTH; i++) { + str += String.fromCharCode(Math.random() * 0x100 | 0) +} + +suite.add('BrowserBuffer#write(' + str.length + ', "binary")', function () { + browserSubject.write(str, 'binary') +}) + +if (!process.browser) { + suite.add('NodeBuffer#write(' + str.length + ', "binary")', function () { + nodeSubject.write(str, 'binary') + }) +} diff --git a/perf/write-hex.js b/perf/write-hex.js index 76b03be5..13227b31 100644 --- a/perf/write-hex.js +++ b/perf/write-hex.js @@ -1,24 +1,27 @@ -const BrowserBuffer = require('../').Buffer // (this module) -const util = require('./util') -const suite = util.suite() +'use strict' -const LENGTH = 4096 -const browserSubject = BrowserBuffer.alloc(LENGTH) -const nodeSubject = Buffer.alloc(LENGTH) +var BrowserBuffer = require('../').Buffer // (this module) +var util = require('./util') +var suite = util.suite() -const charset = '0123456789abcdef' +var LENGTH = 4096 +var browserSubject = BrowserBuffer.alloc(LENGTH) +var nodeSubject = Buffer.alloc(LENGTH) -let str = '' +var charset = '0123456789abcdef' -for (let i = 0; i < LENGTH * 2; i++) +var str = '' + +for (var i = 0; i < LENGTH * 2; i++) { str += charset[Math.random() * charset.length | 0] +} -suite - .add('BrowserBuffer#write(' + LENGTH + ', "hex")', function () { - browserSubject.write(str, 'hex') - }) +suite.add('BrowserBuffer#write(' + str.length + ', "hex")', function () { + browserSubject.write(str, 'hex') +}) -if (!process.browser) suite - .add('NodeBuffer#write(' + LENGTH + ', "hex")', function () { +if (!process.browser) { + suite.add('NodeBuffer#write(' + str.length + ', "hex")', function () { nodeSubject.write(str, 'hex') }) +} diff --git a/perf/write-ucs2.js b/perf/write-ucs2.js new file mode 100644 index 00000000..41529458 --- /dev/null +++ b/perf/write-ucs2.js @@ -0,0 +1,25 @@ +'use strict' + +var BrowserBuffer = require('../').Buffer // (this module) +var util = require('./util') +var suite = util.suite() + +var LENGTH = 16384 +var browserSubject = BrowserBuffer.alloc(LENGTH) +var nodeSubject = Buffer.alloc(LENGTH) + +var str = '' + +for (var i = 0; i < LENGTH / 2; i++) { + str += String.fromCharCode(Math.random() * 0x10000 | 0) +} + +suite.add('BrowserBuffer#write(' + str.length + ', "ucs2")', function () { + browserSubject.write(str, 'ucs2') +}) + +if (!process.browser) { + suite.add('NodeBuffer#write(' + str.length + ', "ucs2")', function () { + nodeSubject.write(str, 'ucs2') + }) +} diff --git a/perf/write-utf8.js b/perf/write-utf8.js new file mode 100644 index 00000000..8aa3fc01 --- /dev/null +++ b/perf/write-utf8.js @@ -0,0 +1,297 @@ +'use strict' + +var BrowserBuffer = require('../').Buffer // (this module) +var util = require('./util') +var suite1 = util.suite(false) +var suite2 = util.suite(false) +var suite3 = util.suite(false) + +var LENGTH = 7706 +var browserSubject = BrowserBuffer.alloc(LENGTH) +var nodeSubject = Buffer.alloc(LENGTH) + +// LLM-generated poems in east asian languages. +// Hopefully a lot of surrogate pairs in here. +var str = ` +// Simplified Chinese +青山翠影悠悠,碧水波光荡漾。 +花香飘溢四季,鸟语声声入耳。 + +古道弯曲曲折,石桥横跨溪流。 +林间小径幽深,翠竹摇曳风柔。 + +诗意浓郁如画,山水间流淌诗章。 +夜空繁星点缀,月光洒落如霜。 + +岁月匆匆如梭,人生如梦难留。 +思绪如云飘渺,往事如梦难求。 + +但愿心随风飘逸,宛如山水永恒。 +愿友情如石坚固,爱情似水柔情。 + +山川河流万古,情感岁月悠长。 +愿世间皆安康,美梦绵长不忘。 + +春日樱花绽放,芬芳飘散风中。 +夏夜萤火闪烁,为爱守护梦境。 + +秋天果实饱满,金黄满地落叶。 +冬日雪花纷飞,白色覆盖大地。 + +日出东方海面,曙光照耀大地。 +日落西山峰峦,夕阳映照山水。 + +繁星点点夜空,宇宙神秘莫测。 +彩虹横挂天际,七色缤纷光彩。 + +风吹草动山川,涛声奔腾大海。 +翠树葱茏如画,花开芬芳如诗。 + +心灵的旅程漫长,追寻着梦的足迹。 +历经风雨日晒,坚持着不懈追求。 + +爱的火焰永不熄灭,温暖心灵的每一寸。 +友情如清泉潺潺,滋润生活的每一刻。 + +人生的道路崎岖起伏,跌宕起伏如山川。 +但愿心中有希望,勇敢面对每一困难。 + +梦想是前行的航船,翱翔在希望的天空。 +信念是坚实的基石,守护着心灵的堡垒。 + +愿生命如诗歌般丰富,彩虹的每一环都夺目。 +青山绿水永存心间,白云轻描梦的轮廓。 + +尽管时光不可逆,每一刻都是新的开始。 +在这片山水间漫游,感受生命的深邃。 + +爱护大地如同珍宝,呵护自然如同生命。 +拥抱和平如同梦想,心灵清澈如同湖泊。 + +夜幕降临星光闪耀,点点灯火照亮前行。 +静坐聆听心灵之声,感受宇宙的无尽广阔。 + +愿这诗歌伴你入梦,如同温暖的阳光。 +青山翠影悠悠,碧水波光荡漾。 + +// Traditional Chinese +青山翠影悠悠,碧水波光漾漾。 +花香飄溢四季,鳥語聲聲入耳。 + +古道彎曲曲折,石橋橫跨溪流。 +林間小徑幽深,翠竹搖曳風柔。 + +詩意濃郁如畫,山水間流淌詩章。 +夜空繁星點綴,月光灑落如霜。 + +歲月匆匆如梭,人生如夢難留。 +思緒如雲飄渺,往事如夢難求。 + +但願心隨風飄逸,宛如山水永恆。 +願友情如石堅固,愛情似水柔情。 + +山川河流萬古,情感歲月悠長。 +願世間皆安康,美夢綿長不忘。 + +春日櫻花綻放,芬芳飄散風中。 +夏夜螢火閃爍,為愛守護夢境。 + +秋天果實飽滿,金黃滿地落葉。 +冬日雪花紛飛,白色蓋滿大地。 + +日出東方海面,曙光照耀大地。 +日落西山峰巒,夕陽映照山水。 + +繁星點點夜空,宇宙神秘莫測。 +彩虹橫掛天際,七色繽紛光彩。 + +風吹草動山川,濤聲奔騰大海。 +翠樹蔥蘢如畫,花開芬芳如詩。 + +心靈的旅程漫長,追尋著夢的足跡。 +歷經風雨日曬,堅持著不懈追求。 + +愛的火焰永不熄滅,溫暖心靈的每一寸。 +友情如清泉潺潺,滋潤生活的每一刻。 + +人生的道路嶙峋起伏,跌宕起伏如山川。 +但願心中有希望,勇敢面對每一難關。 + +夢想是前行的航船,翱翔在希望的天空。 +信念是堅實的基石,守護著心靈的堡壘。 + +願生命如詩歌般豐富,彩虹的每一環都耀眼。 +青山綠水永存心間,白雲輕描夢的輪廓。 + +盡管時光不可逆,每一刻都是新的開始。 +在這片山水間漫遊,感受生命的深邃。 + +愛護大地如同珍寶,呵護自然如同生命。 +擁抱和平如同夢想,心靈清澈如同湖泊。 + +夜幕降臨星光閃耀,點點燈火照亮前行。 +靜坐聆聽心靈之聲,感受宇宙的無窮廣闊。 + +願這詩歌伴你入夢,如同溫暖的陽光。 +青山翠影悠悠,碧水波光漾漾。 + +// Japanese +星の輝きが夜空に広がり、 +月が静かに佇む夜。 +風が優雅に舞い、 +心は静寂に包まれる。 + +山々が青々と茂り、 +川の流れが穏やかに響く。 +四季折々の色彩が交錯し、 +自然の美が心に響く。 + +春の訪れ、桜が舞う季節。 +花びらが風に舞い散り、 +桜の花が満開に輝く。 + +夏の日差し、陽射しが照りつける。 +蝉の声が響き、 +夏の風が爽やかに吹く。 + +秋の深まり、紅葉が彩る風景。 +赤や黄色に染まる葉が美しく、 +秋の実りが感謝の気持ちに満ちる。 + +冬の訪れ、雪が舞う寒さ。 +白い雪が大地を覆い、 +冷たい空気が心地よい。 + +日々の暮らしの中で出会う人々、 +笑顔や涙、共有する瞬間。 +それぞれの思いが交わり、 +心は温かなつながりを感じる。 + +夢や希望、追い求める未来。 +目指す場所への旅路は遠く、 +でも一歩ずつ進んでいく。 + +愛する人との出会いと別れ、 +時折の別離や悲しみも。 +だけど心に残る思い出が、 +永遠に続く絆を紡ぐ。 + +心の中で奏でるメロディ、 +感じる情熱や情緒。 +それは一つの詩となり、 +生命の調べが響き合う。 + +喜びや苦しみ、様々な感情。 +人生の舞台で繰り広げられる +様々なドラマに心を寄せて。 + +星座が語る古代の物語、 +月明かりが照らす夜道。 +自然の美しさと調和し、 +心が安らぐ時間が流れる。 + +鳥のさえずりや波の音、 +自然の音楽が耳に響く。 +そんな瞬間が積み重なり、 +豊かな生活の一部となる。 + +生命の循環、花開く命。 +大地の恵みと感謝の心。 +人と自然が共存し、 +調和の中で生かされる。 + +日々の小さな幸せに感謝し、 +愛と希望を育みながら。 +それぞれが紡ぐ一つの物語、 +未来へと続く無限の旅路。 + +// Korean +별들이 미소 짓는 어둠의 밤, +달빛이 살며시 비치는 길. +바람이 부드럽게 속삭이며, +잠든 도시에 휴식을 안긴다. + +산과 강, 들과 꽃, +자연의 노래가 울려 퍼진다. +새들이 자유롭게 날아가며, +하늘은 푸르게 펼쳐져 있다. + +봄이 와 꽃들이 피어나면, +사랑의 노래가 더욱 높아진다. +여름이 찾아오면 녹음이 푸릇푸릇, +가을이 다가오면 잎들이 노래한다. + +겨울이 와 눈이 내리면, +하얀 눈더미가 우리를 감싼다. +세상은 찬란한 풍경으로 변하고, +마음은 평화롭게 울린다. + +우리의 삶은 시간의 흐름에 맞춰, +각자의 이야기를 품고 있다. +마주하는 모든 순간은 소중하고, +가슴에 새겨지는 추억이 된다. + +우리의 발걸음은 계절의 변화에 따라, +새로운 경험을 만나고 성장한다. +하나의 노래처럼 흐르는 삶 속에서, +우리의 꿈은 끝없이 펼쳐진다. + +가족과 친구, 사랑하는 이들과 함께, +우리는 공유하며 삶을 즐긴다. +매일매일이 소중한 순간으로 가득하고, +행복한 추억으로 기억된다. + +빛과 어둠, 기쁨과 슬픔, +모든 감정이 우리를 감싸안는다. +하지만 우리는 강인한 마음으로, +모든 도전을 이겨낼 것이다. + +풍요롭고 다채로운 세상, +우리는 그 속에서 삶을 즐긴다. +각자의 색깔을 뽐내며, +하나로 어우러진다. + +희망의 불빛이 항상 우리를 비추며, +미래는 더욱 밝고 환한 것으로 눈앞에 펼쳐진다. +우리는 함께 걸어가며, +새로운 일들을 이룰 것이다. + +우리의 이야기는 무한한 삶의 노래, +하나로 어울려 나아가는 의미 있는 여정. +마음과 마음이 교차하며, +우리의 삶은 계속해서 희망으로 가득하다. +` + +if (BrowserBuffer.byteLength(str, 'utf8') !== LENGTH) { + throw new Error('byteLength mismatch!') +} + +suite1.add('BrowserBuffer.byteLength(' + str.length + ', "utf8")', function () { + BrowserBuffer.byteLength(str, 'utf8') +}) + +if (!process.browser) { + suite1.add('NodeBuffer.byteLength(' + str.length + ', "utf8")', function () { + Buffer.byteLength(str, 'utf8') + }) +} + +suite2.add('BrowserBuffer#write(' + str.length + ', "utf8")', function () { + browserSubject.write(str, 'utf8') +}) + +if (!process.browser) { + suite2.add('NodeBuffer#write(' + str.length + ', "utf8")', function () { + nodeSubject.write(str, 'utf8') + }) +} + +suite3.add('BrowserBuffer#toString(' + str.length + ', "utf8")', function () { + browserSubject.toString('utf8') +}) + +if (!process.browser) { + suite3.add('NodeBuffer#toString(' + str.length + ', "utf8")', function () { + nodeSubject.toString('utf8') + }) +}