曾经看到有文章说应当把单个文件夹的子文件/文件夹数量控制在1000以内,否则会降低性能。
但果真如此吗?100000个子文件夹和10个子文件夹到底有多大的性能差距?
本文通过实验为你揭晓。
测试环境
- Win10 64位
- CPU:i5-6600K 3.50GHZ
- 内存16G
测试方法
- 使用NodeJS测试
- 创建子文件夹数量为 10/100/1000/10000/100000 的文件夹
- 每个子文件夹下都有一个文件,文件名和内容均相同
- 分别对以上文件夹内的文件进行100万次随机读取测试,记录各自的总时间
测试代码如下:
const fs = require('fs');
//创建测试文件夹和文件
function makefile(total) {
console.log(`Start create ${total}...`)
fs.mkdirSync('./' + total);
for (let i = 0; i < total; ++i) {
fs.mkdirSync('./' + total + '/folder' + i);
fs.writeFileSync(`./${total}/folder${i}/index.txt`, `DATA`)
}
console.log('done')
}
//分别创建子文件夹数为 10~100000的文件夹
makefile(10);
makefile(100);
makefile(1000);
makefile(10000);
makefile(100000);
//测试随机读取所有文件
function benchmark(total, testTime) {
const key = `Read in ${total} folders`;
const readOrder = Array.from({ length: total }, (v, i) => i).sort((a, b) => Math.random() - 0.5);
console.time(key)
for (let i = 0, n = 0; i < total && n < testTime; ++i, ++n) {
fs.readFileSync(`./${total}/folder${readOrder[i]}/index.txt`)
if (i === total - 1) {
i = -1;
}
}
console.timeEnd(key)
}
//对每个文件夹下,测试100万次
console.log('文件夹创建完毕,开始测试')
const N = 1000000;
benchmark(10, N);
benchmark(100, N);
benchmark(1000, N);
benchmark(10000, N);
benchmark(100000, N);
测试结果
Read in 10 folders: 24541.274ms
Read in 100 folders: 25982.167ms
Read in 1000 folders: 28444.414ms
Read in 10000 folders: 28590.825ms
Read in 100000 folders: 31163.031ms
10万个子文件夹总时间值比10个子文件夹多6621ms,平均每次读取只多0.0066ms,几乎可以忽略不计。
结论
- 子文件夹数量多确实会降低文件读取性能
- 但是该损耗几乎可以忽略不计
(正文完)