javascript - 多次写入文件与将其保存在内存中并写入一次
问题描述
我希望可以在这里问有关优化的问题,如果不让我知道我可以在哪里,我会删除这篇文章。
另外,如果重要的话,我正在使用 NodeJS。
所以我要及时优化我的应用程序。我仍在创造它的过程中,但我想从一开始就考虑长远。话虽如此,我有两个优化问题
1)在我的一个函数中,我有一个数组,我遍历这个数组并创建一些文本并通过每个循环将其写入/附加到文件中。这意味着如果数组中有 5 个项目,我会写入文件 5 次。但是另一方面,我可以创建一个变量,通过每个循环将文本附加到变量中,最后写入文件。有问题的文本/数组的长度可能很少到可能无限(但在少数方面学习更多)
2)更快的是,删除文件或将空字符串写入文件(当我写入文件时,我使用 appendFile ,因此如果文件存在则附加到文件中,如果文件不存在则创建文件,因此要么删除文件或写入文件有效)
谢谢!
关于优化的主题,我为我的一个元素使用了一个自定义滚轮,当我刷新页面时会出现几秒钟的默认滚轮,然后加载自定义滚轮,自定义滚轮的尺寸较小,所以它在切换时闪烁元素位置。有没有办法在加载滚轮css文件或类似的东西之前不加载元素?
解决方案
通常,有 3 种主要方法可以通过优缺点来做到这一点:
- 附加到文件:始终打开和关闭文件描述符很慢,但您确定文件系统中有什么
- 流到文件:打开文件并写入,必要时关闭
- 缓冲区并写入一次:当心程序退出(SIGNT),如果您没有正确管理它,所有缓冲区都可能丢失
所以这取决于你的范围:速度?鲁棒性?文件的高速率更改?
在您考虑之后,要找出哪个最快,您可以编写如下基准:
const Benchmark = require('benchmark');
const suite = new Benchmark.Suite;
const { Readable } = require('stream')
const util = require('util');
const fs = require('fs');
const append = util.promisify(fs.appendFile);
const text = new Array(500).fill('a'.repeat(5000))
// add tests
const banch = suite
.add('Append sequentially', {
defer: true,
fn: function (deferred) {
Promise.all(text.map(t => append('append.txt', `${t}\n`)))
.then(() => deferred.resolve())
}
})
.add('Write once', {
defer: true,
fn: function (deferred) {
const out = text.reduce((a, b) => `${a}\n${b}`, '')
fs.writeFile('write.txt', out, () => deferred.resolve())
}
})
.add('Stream', {
defer: true,
fn: function (deferred) {
const readable = new Readable()
const writerStream = fs.createWriteStream('stream.txt')
.on('finish', () => deferred.resolve())
readable.pipe(writerStream);
text.forEach(s => readable.push(`${s}\n`))
readable.push(null)
}
})
.on('cycle', function (event) {
console.log(String(event.target));
})
.on('complete', function () {
console.log('Fastest is ' + this.filter('fastest').map('name'));
})
banch.run({ async: true })
这将输出(在我的电脑上):
顺序追加 x 8.69 ops/sec ±21.07%(采样 45 次运行)
写入一次 x 52.22 ops/sec ±5.27%(采样 63 次运行)
流 x 37.76 ops/sec ±2.72%(采样 63 次运行)
最快的是一次写入
与节点 8
推荐阅读
- python - MlFlow 如何手动读取指标
- opencart - 编辑文本并
在 opencart 页脚内容中添加标签 - bootstrap-select - Bootstrap-select 1.13.9 添加新项目选项
- dns - 将合成记录动态分配给 Google Domain
- android - 查找 String[] 是否在 Room 数据库 Android 中包含字符串
- php - Laravel 无法使用模拟的服务和对象测试作业。Mockery 间谍无法检测到被调用的方法
- macos - MacOS 无线诊断 802.11 报告
- php - Laravel 存储库模式 - 关系错误
- azure - 如何使用 Azure 集成运行时设置 Azure 数据工厂的高可用性?
- android - Play Billing - 实施应用内购买以解锁内容并移除广告