Ham*_*oui 3 javascript optimization filereader
我正在开发这个代码,在用户选择目录后,它会显示该位置包含的文件的表格及其详细信息(名称,类型,大小......).
目录可能包含许多文件.
我成功实现了这一目标.但是,我的问题是我想显示每个文件中的行数.我可以使用此JavaScript代码获取行数:
var reader = new FileReader();
var textFile = $("#file").get(0).files[0];
reader.readAsText(textFile);
$(reader).on('load', processFile);
/*And in processFile() i use this line to get the number of lines :*/
nbLines = (file.split("\n")).length;
Run Code Online (Sandbox Code Playgroud)
上面的代码按预期工作,它给了我想要的东西,但如果所选目录中有这么多文件,它可能会很重要!
问题:有没有办法在不读取文本文件的情况下获取行数?
问候!
不打开文档就无法知道行数。关于您遇到的性能问题,很可能来自 .split() 。您将文件作为字符串加载到内存中,然后生成与此文件中的行数一样多的字符串。如果文件包含 1000 行代码,那么最终的 ram 使用量将为 1 个字符串(整个文件) 1000 个字符串(每行 1 个字符串)
我建议使用 RegEx 对此进行评估。这是一个例子
var file = ("this\nis a string\n with new\nlines");
var match = file.match(/\r?\n/g);
alert(match.length);
Run Code Online (Sandbox Code Playgroud)
请记住,根据您的文件,可能需要不同的正则表达式。这肯定会提高性能。
如果不读取文件中的行数,则无法计算.运行代码的操作系统不会将行数存储为某种元数据.它们通常甚至不区分二进制文件和文本文件!您只需阅读文件并计算换行符即可.
但是,如果文件中包含大量行,则可以比现在更快地执行此操作.
这行代码是我担心的:
nbLines = (file.split("\n")).length;
Run Code Online (Sandbox Code Playgroud)
在split此处调用会创建大量内存分配,每个文件对应一行.
我的预感是,在for循环中直接计算换行符会更快:
function lineCount( text ) {
var nLines = 0;
for( var i = 0, n = text.length; i < n; ++i ) {
if( text[i] === '\n' ) {
++nLines;
}
}
return nLines;
}
Run Code Online (Sandbox Code Playgroud)
这会对没有任何内存分配的换行符进行计数,并且大多数JavaScript引擎都应该很好地优化此代码.
根据您想要解释的方式,您可能还希望根据文件是否以换行结束来稍微调整最终计数.但是不要在循环中做到这一点,之后再做.
| 归档时间: |
|
| 查看次数: |
4586 次 |
| 最近记录: |