我用下面两段代码编码Varint,NodeJS大约需要900毫秒,而Rust大约需要2700毫秒.为什么业绩差距这么大?
内存分配看起来更耗时,NodeJS有没有额外的内存分配优化?
NodeJS版本:v20.10.0
Rust版本:1.75.0
JavaScript代码:
// node index.js
const { performance } = require('node:perf_hooks')
function encode_varint(num) {
let buf_size = 0;
let cmp_number = num;
while (cmp_number) {
cmp_number >>>= 7
buf_size += 1;
}
const buf = new Array(buf_size)
let temp_num = num;
let index = 0;
while (temp_num > 0) {
if ((temp_num >>> 7) !== 0) {
buf[index++] = 0x80 | (temp_num & 0x7f)
temp_num >>>= 7;
} else {
buf[index++] = temp_num & 0x7f
break
}
}
return buf;
}
const N = 100_000_000;
const start = performance.now();
for (let i = 0; i < N; i++) {
const num = 999_999_999_999_999;
const buf = encode_varint(num);
// console.log(buf)
}
const end = performance.now();
const elapsed = end - start;
console.log(elapsed);
铁 rust 代码:
// cargo r --release
use std::time;
fn encode_varint(num: usize) -> Vec<u8> {
let buf_size = {
let mut size = 1;
let mut cmp_number = num;
while cmp_number > 0 {
cmp_number >>= 7;
size += 1;
}
size
};
let mut buf: Vec<u8> = Vec::with_capacity(buf_size);
let mut temp_num = num;
while temp_num > 0 {
if (temp_num >> 7) != 0 {
buf.push((0x80 | (temp_num & 0x7f)) as u8);
temp_num >>= 7;
} else {
buf.push((temp_num & 0x7f) as u8);
break;
}
}
buf
}
const N: u32 = 100_000_000;
fn main() {
let start = time::Instant::now();
let num = 999_999_999_999_999;
for _ in 0..N {
let _buf = encode_varint(num);
// dbg!(_buf);
}
let end = time::Instant::now();
let elapsed = end - start;
println!("{}", elapsed.as_millis());
}