【问题标题】:Writing to file multiple times vs Saving it in memory and writing once多次写入文件与将其保存在内存中并写入一次
【发布时间】:2019-06-16 17:27:47
【问题描述】:

我希望可以在这里问有关优化的问题,如果没有,请告诉我在哪里可以,我将删除此帖子。

如果重要的话,我正在使用 NodeJS。

所以我即将到一个我想要优化我的应用程序的时间点。我仍在创造它的过程中,但我想从一开始就考虑长远。话虽如此,我有两个优化问题

1) 在我的一个函数中,我有一个数组,我循环遍历该数组并创建一些文本并通过每个循环将其写入/附加到文件中。这意味着如果数组中有 5 个项目,我会写入文件 5 次。但是另一方面,我可以创建一个变量,通过每个循环将文本附加到变量中,最后写入文件。有问题的文本/数组的长度可能很少,甚至可能无限(但在少数方面学习更多)

2) 更快的是,删除文件或向文件写入空字符串(当我写入文件时,我使用 appendFile 以便在文件存在时附加到文件,如果文件不存在则创建文件,所以要么删除文件或写入文件有效)

谢谢!

关于优化的话题,我正在为我的一个元素使用自定义滚轮,当我刷新页面时会出现几秒钟的默认滚轮,然后加载自定义滚轮,自定义滚轮更小大小,因此它在切换时会闪烁元素位置。有没有办法在加载滚轮 css 文件或类似的东西之前不加载元素?

【问题讨论】:

  • 第 1 点:I/O 操作总是比管理内存中的数据慢。但是大多数 I/O 库(如果不是底层操作系统)倾向于缓冲 I/O,因此差异可能没有您预期的那么大。

标签: javascript node.js performance io


【解决方案1】:

一般来说,有 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-26
    • 1970-01-01
    • 2011-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多