在性能受限的环境中缓存文本/图像资产

时间:2013-05-16 23:18:05

标签: javascript performance browser-cache opera opera-presto

我正在研究性能受限的设备。由于AJAX请求的开销,我打算在浏览器中积极地缓存文本和图像资源,但我需要将每个设备的缓存大小配置为文本的1MB9MB的图像 - 对于多屏幕图形应用程序来说是一个很大的挑战。

由于设备容易达到内存限制,因此我必须非常谨慎地管理应用程序的大小:代码文件大小,并发HTTP请求数,事件发送时JS处理器周期数,限制CSS重排等。我今天的问题是如何为文本资产和图像开发一个大小限制的缓存。

对于文字,我使用JSON.encode().length为对象和'string'.length推出自己的cache近似大小。应用程序手动获取/设置缓存条目。在达到可配置的上限时,类垃圾会从gcLimitgcTarget大小收集自身,为最后访问的属性赋予权重(即,如果最近访问过某些内容,则跳过收集该对象的第一个时间)。

对于图像,我打算预加载界面元素,让浏览器通过删除DOM元素来处理垃圾收集本身,并且永远不会持久存储Image()个对象。对于预加载,我可能会再次推出自己 - 我有模仿FiNGAHOLiC的ImgPreloader和this的例子。我需要记住“下载窗口大小”和“最大缓存请求”等功能,以确保我不会无意中使设备过载。

在这样一个受限制的环境中工作是一个巨大的挑战,像Backbone这样的常见框架不支持“最大集合大小”。在SO的其他地方,用户引用HTML 5MB e的localStorag限制,但我的目标不是会话持久性,所以我没有看到好处。

我不禁觉得可能有更好的解决方案。想法?

编辑:@ Xotic750:感谢您对IndexedDB的认可。可悲的是,这个应用程序是一个基于Opera / Presto的标准网页。更好的是,该平台不提供持久性。摇滚和艰难的地方: - /。

2 个答案:

答案 0 :(得分:1)

如果应用程序是浏览器扩展(您没有提到您的应用程序是什么),则

localStorage和sessionStorage(DOM Storage)限制不适用(or can be overridden)。

localStorage是持久的

sessionStorage是会话

看看IndexedDB它虽然没有得到广泛的支持,但它更灵活。

此外,还有一些对Chrome存储的引用

Managing HTML5 Offline Storage

chrome.storage

答案 1 :(得分:0)

使用现代javascript引擎cpu / gpu性能对于大多数应用程序(除了游戏,重型动画或闪存)都不是问题,即使是低功耗设备,所以我怀疑你的主要问题是内存和io。优化一方通常会伤害另一方,但我怀疑下面的问题将是您的主要关注点。

我不确定您是否可以控制浏览器的缓存使用情况。您可以使用类似于您建议的方法来限制javascript应用程序占用的内存,但浏览器仍会自行执行此操作,这可能是内存方面的主要问题。通过创建自己的缓存,您可能实际上会复制已经被浏览器缓存的数据,从而加剧了内存问题。浏览器(除非你使用的东西模糊不清)通常会比javascript更好地进行缓存。在任何情况下,我强烈建议让浏览器处理垃圾收集,因为javascript中没有办法实际强制浏览器释放内存(他们在需要时进行垃圾收集,而不是在你告诉他们时)。您是否可以控制设备上使用的浏览器?如果这样做,那么更改它可能是减少内存使用量的最佳方法(也可以限制浏览器缓存的大小?)。

对于ajax请求,请确保您完全理解GET和POST之间的区别,因为这会对浏览器上的缓存和Web上的代理路由消息产生重大影响(因此也会影响应用程序的逻辑)。看看你是否可以通过将请求组合在一起来最小化请求数量(JSON有帮助)。通常延迟而不是带宽是AJAX请求的问题(但是不要太过分,因为大多数浏览器可以同时执行多个请求)。确保构建您的ajax管理器以允许请求的优先级(即,影响用户看到的优先于预加载的内容,优先于分析的内容 - 一半的网页有谷歌分析调用,这是页面加载后发生的第一件事,甚至在广告之前和其他内容加载。)

除此之外,我建议图像可能是内存问题的主要原因(我怀疑代码大小甚至是寄存器,但你应该确保代码被最小化,例如google关闭)。将图像分辨率降低到最低限度并尝试使用文件格式(例如,对于某些图像(漫画,徽标,图标),gif或png可能比jpeg小得多,但对于其他图像(照片,渐变)则要大得多。

你的应用程序中10MB的缓存可能听起来很小,但与大多数应用程序相比,它实际上是巨大的。大多数人将缓存留给浏览器(无论如何,它仍然可能会缓存数据,无论你是否想要它)。

你提到的Image对象表明你正在使用画布。如果您创建一个新的画布来存储图像(之后您可以放弃Image对象),则速度会有明显的提升。您可以将此画布用作以后需要复制到画布的任何图像数据的源,并且由于不需要在数据类型之间进行转换,因此速度要快得多。鉴于画布操作通常会在一帧内多次发生,这可能是一个显着的提升。

最后注意事项 - 不要使用在桌面环境下开发的框架/库。要优化性能(无论是速度还是内存),您需要了解每一行代码。查看库的源代码(许多都有一些非常聪明的优化代码)但是假设一般来说,你是一个特殊情况,它们没有被优化。