ClojureScript Hash Map性能与Javascript对象

时间:2013-05-27 11:28:25

标签: javascript performance clojurescript

我正在使用ClojureScript应用程序中的大JSON文件(基本上包含树状结构)。基本上我遍历那个树结构中的所有元素,这些是相当多的操作。现在我想知道Lazy Hash地图处理会带来多少开销。

基本上我:

  • 通过AJAX加载JSON文件
  • 使用浏览器的JSON.parse
  • 将其转换为JS对象
  • 使用js->clj :keywordize-keys true将其转换为clojure结构

JSON的结构由嵌套列表和哈希映射组成。像

这样的东西
{:A-key-a [{:B-key-a 34  :B-key-b [213. 23.4]}
                   {:B-key-a 34  :B-key-b [213. 23.4]}
                   ...] 
 :A-key-b [{:someother-a 30 ...}
                   ...]
 ...}

现在我想知道是否应该回归直接使用JS对象获取spped。直觉上我认为这比ClojureScript对象更快,另一方面我不想过早优化,我不太了解ClojureScript的内部结构,以判断懒惰评估引入的开销。

我认为我可以使用.-mykey访问器语法和google closure foreach函数来重写特定的源代码。你觉得怎么样?

我在类似的选择主题上看到Improve performance of a ClojureScript program,我认为这也意味着loop .. recur似乎是一个可行的循环选项。是吗?

1 个答案:

答案 0 :(得分:2)

如果它在您的控制之下,请考虑在服务器端生成EDN而不是JSON。我不确定解析EDN字符串是否比将JSON转换为EDN更快,但至少它会在一定程度上降低应用程序的复杂性。

根据您的描述,听起来数据结构将是“只读”。然后,对象构建成本实际上是您必须考虑的唯一成本 - 稍后读取它将是便宜的(持久性地图和向量具有接近恒定的访问时间)。

根据数据结构大小,用户可能无法在页面加载时感知UI如何因此计算任务而阻塞。考虑测量它。

在JS数组之间可以被视为seqs,并且关键字键在ClojureScript中不如在Clojure中那么强大(这里它们没有实现IFn),实际上没有那样在这种特殊情况下,EDN优于JSON的许多优点。

对于迭代,虽然map / vector不是惰性的,但Clojure(Script)的数据处理函数(map / filter / etc)的结果返回延迟序列 - 并生成中间体在路上收藏。

您可以使用最近移植的reducers库以及transient / persistent!工具(如果这在您的应用中成为实际问题)来避免相关的开销