为什么'file.size'花了很多时间,又如何减少时间
Why does 'file.size' take a lot of time, and how to reduce the time?
我正在制作一个应用程序,处理被拖到应用程序的歌曲。当我使用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
接口的定义显示,File
是Blob
,而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()下的时间设置,它将为您提供更好的性能。您需要确保在加载并显示文件之前,此时间不会超时。
- 引导时间选择器在增加或减少小时和分钟的同时获取 NaN
- 如何减少'current'setTimeOut中的时间
- Jquery日期选择器从选定的epoch时间减少一天
- 如何减少 webpack 开发服务器重建时间
- 减少jQuery颜色动画的加载时间
- 最大限度地减少Google AdWords Script的响应时间
- 减少 Angular JS 中的分页加载时间
- 磁头.js - 何时用于提高性能(减少加载时间)
- 如何减少Gwt多入口点项目应用程序的初始加载时间
- 如何将时间减少百分之几分秒
- 如何进一步减少加载时间(Visualforce、Apex、Angular)
- 如何通过调整图像大小和应用属性来减少页面加载时间
- 将结合3个javascript块与谷歌通用分析改善/减少页面加载时间的任何显著量
- 如何结合两个jQuery函数的代码来减少执行时间?
- 当使用多个css时,如何减少页面加载时间
- 如何减少页面加载时间
- 如何在使用setTimeout时减少打印时间
- webview android最大限度地减少Java脚本加载时间
- 通过下拉菜单在数组之间切换需要花费相当多的时间.我如何减少它??Angularjs IvhTreeview
- JavaScript日期时间转换减少一天