-
Notifications
You must be signed in to change notification settings - Fork 30.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Buffer.byteLength is called whenever a new string Buffer is created. UTF8 is used as the default encoding, and base64 is also popular. These must be fast and take up a relatively significant part of Buffer instantiation. This commit moves the Buffer.byteLength calculations into only JS-land, moving it from C++ land for base64 and UTF8. It also removes the ByteLength function on the C++ Buffer. It also adds a benchmark for both encodings; the improvements hover for UTF8, change a lot, but base64 is about
- Loading branch information
1 parent
0a48a8b
commit f6299c4
Showing
4 changed files
with
123 additions
and
23 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,55 @@ | ||
var common = require('../common'); | ||
|
||
var bench = common.createBenchmark(main, { | ||
encoding: ['utf8', 'base64'], | ||
len: [1, 2, 4, 16, 64], // x16 | ||
n: [5e6] | ||
}); | ||
|
||
// 16 chars each | ||
var chars = [ | ||
'hello brendan!!!', // 1 byte | ||
'ΰαβγδεζηθικλμνξο', // 2 bytes | ||
'挰挱挲挳挴挵挶挷挸挹挺挻挼挽挾挿', // 3 bytes | ||
'𠜎𠜱𠝹𠱓𠱸𠲖𠳏𠳕𠴕𠵼𠵿𠸎𠸏𠹷𠺝𠺢' // 4 bytes | ||
]; | ||
|
||
function main(conf) { | ||
var n = conf.n | 0; | ||
var len = conf.len | 0; | ||
var encoding = conf.encoding; | ||
|
||
var strings = []; | ||
for (var string of chars) { | ||
// Strings must be built differently, depending on encoding | ||
var data = buildString(string, len); | ||
if (encoding === 'utf8') { | ||
strings.push(data); | ||
} else if (encoding === 'base64') { | ||
// Base64 strings will be much longer than their UTF8 counterparts | ||
strings.push(new Buffer(data, 'utf8').toString('base64')); | ||
} | ||
} | ||
|
||
// Check the result to ensure it is *properly* optimized | ||
var results = strings.map(function(val) { | ||
return Buffer.byteLength(val, encoding); | ||
}); | ||
|
||
bench.start(); | ||
for (var i = 0; i < n; i++) { | ||
var index = n % strings.length; | ||
// Go! | ||
var r = Buffer.byteLength(strings[index], encoding); | ||
|
||
if (r !== results[index]) | ||
process.exit(1); | ||
} | ||
bench.end(n); | ||
} | ||
|
||
function buildString(str, times) { | ||
if (times == 1) return str; | ||
|
||
return str + buildString(str, times - 1); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters