k8w.io
文件夹数量对文件读取性能的影响
2017-11-23作者:k8w

曾经看到有文章说应当把单个文件夹的子文件/文件夹数量控制在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,几乎可以忽略不计。

结论

  • 子文件夹数量多确实会降低文件读取性能
  • 但是该损耗几乎可以忽略不计
(正文完)
留言(0条)
发表新留言
您的大名:
必填
电子邮箱:
不公开,仅用于向你发送回复