【问题标题】:Nodejs: Huge performance difference among UUID in normal string, base64 string and Buffer comparisonNodejs:UUID在普通字符串、base64字符串和Buffer比较中的巨大性能差异
【发布时间】:2016-07-17 06:32:30
【问题描述】:

结果:

true
base64: 35.758ms
true
string: 12.811ms
true
buffer: 127.691ms

代码:

let n = 1000000;

let uuid = require("node-uuid");

let uuidaString = uuid.v4(),
    uuidbString = uuidaString.slice(0),

    uuidaBuffer = uuid.parse(uuidaString, new Buffer(16)),
    uuidbBuffer = uuid.parse(uuidbString, new Buffer(16)),

    uuidaBase64 = uuidaBuffer.toString("base64"),
    uuidbBase64 = uuidbBuffer.toString("base64");

console.log(uuidaBase64 === uuidbBase64);
console.time("base64");
for (let i = 0; i < n && uuidaBase64 === uuidbBase64; i++) {

}
console.timeEnd("base64");

console.log(uuidaString === uuidbString);
console.time("string");
for (let i = 0; i < n && uuidaString === uuidbString; i++) {

}
console.timeEnd("string");


console.log(Buffer.compare(uuidaBuffer, uuidbBuffer) === 0);
console.time("buffer");
for (let i = 0; i < n && Buffer.compare(uuidaBuffer, uuidbBuffer) === 0; i++) {

}
console.timeEnd("buffer");

有人解释结果吗?我希望正常的字符串比较会是最慢的,但它显示最快。除此之外,我希望 base64 字符串比较会比普通字符串比较快,因为 base64 字符串比普通字符串短。是bug吗?

【问题讨论】:

    标签: node.js string base64 buffer


    【解决方案1】:

    试试这个:

    uuidbBase64 = uuidaBase64.slice(0)
    

    当我这样做时,我看到常规字符串与 base64 字符串的时间几乎相同。

    也许.slice(0) 只是返回同一个对象,所以不必逐个字符比较?

    【讨论】:

    • w3schools.com/jsref/jsref_slice_array.asp slice() 方法将数组中的选定元素作为新数组对象返回。
    • 我们不是在调用数组切片,而是在调用字符串切片:w3schools.com/jsref/jsref_slice_string.asp
    • 无论如何,我使用了“也许”和一个问号,因为我实际上并不知道为什么.slice(0) 版本可以进行快速比较。我只是假设。您可以改用.split('').join('')(在这两种情况下)以获得较慢的比较。
    • 顺便说一句,对于慢速版本(使用 .split('').join('')),我发现 base64 字符串比较比比较长字符串要快得多。
    • 我认为你是对的。这也证明 string.slice(0) 返回相同的引用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-22
    • 2014-10-02
    • 2010-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多