diff --git a/perf/util.js b/perf/util.js
index 5984384..eb49806 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 0000000..0742119
--- /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 0000000..ed71a53
--- /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 76b03be..13227b3 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 0000000..4152945
--- /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 0000000..8aa3fc0
--- /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')
+  })
+}