【问题标题】:Speed up node.js array manipulation加速 node.js 数组操作
【发布时间】:2011-10-14 13:09:50
【问题描述】:

我需要将一个大文件转换为以下格式:对于每个字节,将该字节打印为字符并将其十进制值打印在括号中,这样“@”就变成了“@[64]”。我有以下内容:

var s = fs.createReadStream(path,  { encoding: 'binary' });  
var p = [];

s.addListener('data', function(data) {     
    for(var i = 0; i < data.length; i++) {
            p.push(data.charAt(i)  + "[" + data.charCodeAt(i) + "]");
    }
});

s.addListener('end', function(data) {     
    console.log(p.join(""));
});

然而,这种工作非常缓慢。有什么想法可以优化吗?

更新。根据评论,添加了一些日期语句,并发现“p.push”行占用了大部分时间。所以我想问题不在于文件读取。不过,问题仍然存在 - 如何加快速度。

【问题讨论】:

  • 你有没有分析过?重要的是要弄清楚这段代码是花时间做你自己的工作(即数组操作)还是只是在等待文件系统。在后一种情况下,您无能为力。
  • @Domenic:我如何分析 node.js 代码?
  • console.logDates 应该可以帮助您入门。对于更高级的解决方案,您可能需要 Node Inspector:howtonode.org/debugging-with-node-inspector

标签: javascript node.js io


【解决方案1】:

如果文件是 utf-8,您可能需要先对其进行解码。另外,不要使用二进制编码,它现在基本上已经被弃用了。

这是一个例子:

var fs = require('fs')
  , StringDecoder = require('string_decoder').StringDecoder;

var stream = fs.createReadStream('/path/to/my/file')
  , decode = new StringDecoder('utf8')
  , out = [];

stream.on('data', function(buff) {
  buff = decode.write(buff);
  for (var i = 0, l = buff.length; i < l; i++) {
    out.push(buff[i] + ' [' + buff.charCodeAt(i) + ']');
  }
});

stream.on('end', function() {
  console.log(out.join('\n'));
});

为了更简单,您还可以使用读取流的内置解码功能:stream.setEncoding('utf-8'); 而不是自己制作 StringDecoder,但在某些情况下使用您自己的可能很有用,例如您仍然可以直接访问缓冲区。

编辑:抱歉,没有看到您要求优化。你正在做的事情本质上是缓慢的。我以为你只想要它用于调试目的。首先可能有更好的方法来做你想做的事情。但是,既然您无论如何都在缓冲所有内容,那么您不妨执行fs.readFile 并走过缓冲区。

【讨论】:

  • 你能否展示一个使用 0.5.9 中的 Buffer 方法而不是使用第 3 方 string_decoder 对象的示例
  • 为什么“string_decoder”在 0.5.9 文档中的搜索命中率为零?应该记录在案。
猜你喜欢
  • 2014-09-03
  • 1970-01-01
  • 2022-08-14
  • 2021-12-24
  • 1970-01-01
  • 2022-08-18
  • 2012-05-07
  • 2020-10-24
  • 2015-11-08
相关资源
最近更新 更多