2014-03-19 188 views
3

我正在处理大量的数据。
机制:
JavaScript正在读取WebSQL数据库,然后将数据组装成具有树结构的Object。
然后应用于树对象knockout.js(使元素可观察),然后数据绑定 ,然后在最后应用Jquery Mobile UI。有没有办法控制Chrome GC?

整个过程需要不可接受的时间。
我已经优化算法,使树对象的数据, 还优化转换为observables机制,将项目直接推入到ko.observable数组中并仅调用hasMutated一次。 我正在将knockout.js IF绑定应用于不处理UI中的不可见树节点,直到父项被打开。

这里的表现是关键。
在Chrome开发人员工具中检查时间线中的页面加载后,我注意到当我构建树对象时,垃圾收集器正在清理每个并发呼叫。

Chrome timeline - we can see GC collecting items multiple times

问:有没有办法暂时禁用浏览器的GC,然后重新启用它,我与页面处理完成后?

PS我知道我可以添加对收集到的部分的引用,主要介绍支配并阻止GC收集的对象,但这需要通过代码进行重大更改,并且我不确定我能保持足够长的时间,并且它很可能会引入内存泄漏。当然,必须有更好的办法

+1

你确认性能问题是关于JavaScript,而不是DOM?你可以注释掉'//ko.applyBindgs(viewmodel);',它跳过了所有的DOM变化,你可以测试纯粹的JavaScript性能。 – huocp

+0

您无法禁用GC,因为它的执行是在JavaScript上独立管理的,您只能强制执行它由开发人员工具 –

+0

重复http://stackoverflow.com/questions/13950394/forcing-garbage-collection-in-google-chrome –

回答

0

不,没有办法来禁用垃圾收集器。不可能存在,因为当请求更多的内存时,Chrome应该做什么,但没有可用的内存? (另外,垃圾收集器非常细腻和复杂;您的屏幕截图有点太小,无法读取,但很可能您所看到的只是一小步增量工作以跟上分配,和/或“小GC”循环,这些循环只能在新分配发生的堆的相对较小的区域上进行操作。)

如果你想减少在GC中花费的时间,那么主要的方法是如何实现这个分配更少和/或更小的物体。是的,这可能意味着更改您的应用程序的设计,以便重用对象而不是短暂的或策略中的类似更改。

如果你分配很多,你会看到很多GC活动,这是没有办法解决的。即使在不被认为是“垃圾收集”的语言/运行时间中也是如此,例如,在C/C++中使用new/delete很多也有性能成本。

相关问题