在Javascript中:内存分配与大对象操作

时间:2012-08-08 11:43:45

标签: javascript memory

我有一个JavaScript模块,可以维护和操作大量数据。我有四个大型结构 - 每个基本上都是数组对象的对象。其中有很多数据。当用户执行删除或更新某些操作时,我需要浏览每个结构并可靠地修改结构以反映更改。在某些结构中,根据用户操作,我不知道我需要更改哪个“leaf”对象,所以我必须遍历所有等等。

在发生更改时操作这些大型结构的替代方法是将它们归零并从原始数据重建它们。这就是我的问题:

从性能的角度来看,在Javascript中,循环和修改现有(大型)数据结构或简单地从原始数据重构结构会更优化吗?

我确定答案可能是“它取决于”但是a)假设大量数据; b)假设频繁更改该数据。

2 个答案:

答案 0 :(得分:1)

抱歉,我知道你不期待这个答案,但“这取决于”:-)然而,我认为我能给你的最佳答案就是当我遇到完全相同的问题时我所做的:我自己实现了简单的测试平台来衡量在巨大的超级项目上进行某些操作所花费的时间:我得到了不同级别的信息熵的平均时间测量,并且它转变为最快的解决方案是从原始重建结构。我在Internet Explorer中特别注意到了这一点。也许IE在循环中表现不佳(我在推测)并且遍历超级对象比重建它要慢得多。因此,它可能不仅取决于超级对象的结构,还取决于javascript引擎。

但是,再一次,这是我的理由。我建议你自己实现一个简单的测试平台:它不需要花费太多时间,但最终会让你获得好的结果; - )

修改

就像一个附录一样,我想知道是否在服务器端构建superobject然后将其作为JSON对象发送回浏览器会改善结果。我不知道你的情况是否可行。你可以实现某种AJAX可访问的PHP脚本,它接收命令(例如插入,删除,重命名,等等......)然后它将新的JSON对象发送回浏览器,浏览器只会解析对象(可能快速操作??)

答案 1 :(得分:0)

我不确定它是否适用于此,但它让我想起blog post from wingolog.org关于v8的实现:

  爱德华:维亚切斯拉夫·叶戈罗夫写道,V8所留下的是什么   实际上是函数源,而不是AST。它根据需要重新解析。   说得通。我记得Lars Bak在一段视频中说,来源是   最紧凑的IR,确实可能就是这种情况。

基本上,当v8编译JavaScript时,它只保留原始数据(源代码),因为在这种情况下,内存占用最多会影响性能。