5

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

在发生更改时操作这些大型结构的另一种方法是将它们清空并从其原始数据中重建它们。这就是我的问题:

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

我确信答案可能是“视情况而定”,但是 a) 假设有大量数据;b) 假设该数据经常更改。

4

2 回答 2

1

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

但是,这又是我的情况。我建议自己实现一个简单的测试平台:它不会花费太多时间,但最终会让你得到很好的结果 ;-)

编辑

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

于 2012-08-08T16:31:54.023 回答
0

我不确定它是否适用于此,但它让我想起了来自wingolog.org 的一篇关于v8 实现的博客文章:

Ed.:Vyacheslav Egorov 写道,V8 保留的实际上是函数源,而不是 AST。它根据需要重新解析。说得通。我记得 Lars Bak 在一段视频中说过,源是最紧凑的 IR,也许确实如此。

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

于 2012-08-08T16:13:12.510 回答