JavaScript API性能对比系列三:二维表单按行遍历和按列遍历

以下是测试性能的环境

CPUAMD Ryzen 9 5900HX with Radeon Graphics 八核
操作系统Windows 11 家庭中文版 (64位)
内存16GB(3200 MHz / 3200 MHz)
Nodejsv18.16.0

代码

const rowCount = 10000;
const colCount = 10000;
const arr = Array(rowCount).fill(null).map(t => Array(colCount).fill(0));

console.time('按行遍历')
for (let row = 0; row < rowCount; row++) {
    for (let col = 0; col < colCount; col++) {
        const value = arr[row][col];
    }
}
console.timeEnd('按行遍历')

console.time('按列遍历')
for (let col = 0; col < colCount; col++) {
    for (let row = 0; row < rowCount; row++) {
        const value = arr[row][col];
    }
}
console.timeEnd('按列遍历')

测试结果

行遍历列遍历
1亿39.183ms94.127ms
2500万11.964ms21.389ms
900万5.046ms9.576ms
225万2.782ms2.937ms
100万2.361ms1.978ms
1万0.35ms0.162ms
1000.07ms0.009ms

总结

在行*列数量大于225万是行遍历快。

在行*列数量小于225万是列遍历快。

分析

一个二维数组,如下:

一般来说是行优先存储的数组,行优先遍历速度快。

反之,列优先存储的数组,列优先遍历速度快。

测试结果表明Javascript看起来用的不是这两种存储方式。

实际上Javascript的数组使用的是类似哈希表的方式去进行存储的。他的数据存储并不能保证是连续的,如果想使用连续的内存空间创建数组,请使用ArrayBuffer

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值