为什么'file.size'花了很多时间,又如何减少时间

Why does 'file.size' take a lot of time, and how to reduce the time?

本文关键字:时间 何减少 file size 为什么      更新时间:2023-09-26

我正在制作一个应用程序,处理被拖到应用程序的歌曲。当我使用file.size来获取文件的大小时,它需要大约1500ms (avg)来获得此值。有更快的方法吗?我理解为什么它需要时间(和内存),但因为我是在HTML5中处理文件的新手,也许有一些我不知道的东西可以使过程更快。

对于文件系统API也是如此。如果我通过它调用文件并调用file.size,则需要类似的时间。

PS我通过在我的代码中添加console.time()得到了这个结论。

这是代码(大量剥离)

fileSystem.root.getFile(id, {}, function(fileEntry) {
    fileEntry.file(function(audioTemp) {
        console.time(1);
        console.log(audioTemp.size);
        console.timeEnd(1)
    });
});

这是文件系统API示例。这(显然)需要名为id的文件才能工作。下面是D&D文件输入代码

function onChangeAddSongsInput() {
    var files = document.getElementById('addSongsInput').files;
    for(var i=0; i<files.length; i++) {
        console.time(1);
        console.log(files[i].size);
        console.timeEnd(1)
    }
}

编辑

我使用的是AMD的双核处理器,2.7 GHz, 2g内存,win7 x64。我相信它的规格已经足够不错了。所以,如果某件事在我的机器上确实需要很长时间,我将把它当作不去做。

这是我的应用程序中的一个主要错误修复的拦截器。我真的很想为这个长时间包括一个修复。我不能设置赏金(现在),也许在赏金设置之前有一个最小时间。

编辑

我做了一些测试,结果证明,它需要很长时间,因为chrome 计算的大小,而不是仅仅从一些元数据中读取它。这是测试结果。

文件越大,需要的时间越长,如果第二次调用,它会使用一些缓存,不会加载文件。所以现在. .我怎样才能缩短这个时间呢?在我的应用程序中,大小是一个重要的信息,但可能还没有重要到减慢用户上传每个文件1.5秒的速度!我计划导入库,当添加100首左右的歌曲时,这将有助于减少这种时间。这一次将是应用程序响应时间的一个重大飞跃。

这是一个准有根据的猜测:

查看HTML5 File接口的定义显示,FileBlob,而size属性实际上是Blob接口的一部分。

由于Blob是对原始数据块的抽象,访问size属性实际上可能导致实现将整个文件加载到内存中。您可以编写一个实验,看看延迟是否随文件大小而变化,或者延迟是否只发生在第一次读取size属性时。

编辑:

我真的觉得这种低效率是浏览器实现File接口的问题,但是这里有两个关于如何避免将大文件加载到内存时延迟的解决方法:

Web workers(MDN参考,WHATWG Webapps标准)将允许您将文件的缓慢加载基本上放在另一个线程中。我认为这是你最好的选择。

另一种方法是使用Blob接口的slice方法加载File的一小部分。如果slice的实现只加载文件所需的部分,它应该运行得更快。您必须为每个文件加载多个片,并且需要通过注意slice返回的Blob的大小来检测何时到达文件的末尾。您将通过返回比预期小的blob来检测文件的结束—从规范:

如果索引算术超过size的界限,slice方法必须箝位size的值。特别地,这意味着对于给定的切片调用:

如果start + length> size,那么用户代理必须返回一个Blob对象,就像调用slice(start, size-start)一样。

如果start> size,则用户代理必须返回大小为0的Blob对象

不幸的是,规范还提到了当您请求超出Blob缓冲区大小的切片时抛出异常的可能性——在任何这样做的实现上,您都必须捕获异常以检测文件的结束

如果您增加Console.Time()下的时间设置,它将为您提供更好的性能。您需要确保在加载并显示文件之前,此时间不会超时。