javascript – 为什么“file.size”需要很多时间,如何减少时间?

前端之家收集整理的这篇文章主要介绍了javascript – 为什么“file.size”需要很多时间,如何减少时间?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在制作一个应用程序,处理被拖动到应用程序的歌曲.当我使用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,2 gig的ram,win7 x64,我相信的规范实际上是体面的.所以如果某些东西在我的机器上花费足够长的时间,我会把它作为一个不要去的东西.

这是我的应用程序中的主要错误修复的阻止程序.我真的很想运送这个很长时间的修复包括.我不能设置一个赏金(还),也许在设置赏金之前有一个最短的时间.

编辑

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

文件越大,需要的时间越长,如果第二次使用某些缓存,并且不加载文件.所以现在..我该如何减少这个时间?大小是我应用程序中的重要信息,但可能不够重要,可以将用户的每个文件上传速度降低约1.5秒!我正在计划进口图书馆,这真的有助于减少这个时候添加100首歌曲.这段时间将是应用程序响应时间的重大突破.

解决方法

这是一个准教育猜测:

看看the definition of the HTML5 File interface显示一个文件是一个Blob,并且size属性实际上是Blob interface的一部分.

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

编辑:

我真的觉得这种低效率是浏览器实现File界面的一个问题,但是在将大型文件加载到内存中时,这里有两个解决方法:避免延迟;

Web工作人员(MDN reference,WHATWG Webapps Standard)将允许您将文件的缓慢载入本质上放在另一个线程中.我认为这是你最好的选择.

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

The slice method MUST clamp on values of size if index arithmetic exceeds the bounds of size. In particular,this means that for a given slice call:

If start + length > size then a user agent MUST return a Blob object as if slice(start,size-start) was called.

If start > size then a user agent MUST return a Blob object of size 0

不幸的是,该规范还提到了在Blob缓冲区大小之外请求切片时抛出异常的可能性 – 在执行此操作的任何实现上,都必须捕获异常来检测文件的结尾.

原文链接:/js/154206.html

猜你在找的JavaScript相关文章