ClojureScript哈希映射性能与Javascript对象

ClojureScript Hash Map performance vs. Javascript Objects

本文关键字:Javascript 对象 性能 哈希 映射 ClojureScript      更新时间:2023-09-26

我在ClojureScript应用程序中使用大JSON文件(基本上包含树状结构)。基本上我迭代该树结构中的所有元素,这些都是相当多的操作。现在我想知道延迟哈希映射处理造成了多少开销。

基本上我:

  • 通过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对象来获得速度。直觉上,我认为这比ClojureScript对象更快,另一方面,我不想过早地优化,我对ClojureScript的内部了解不够,以判断延迟计算引入的开销。

我有点figure,我可以使用.-mykey访问器语法和谷歌闭包为每个函数,以重写特定的源代码。你觉得呢?

我已经看到ClojureScript程序在类似的优化主题上的性能提高,我认为这也意味着loop .. recur似乎是循环的可行选择。对吗?

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

根据你的描述,听起来数据结构将是"只读的"。那么对象的构造成本实际上是你需要考虑的唯一成本——稍后读取它会很便宜(持久映射和向量的访问时间几乎是恒定的)。

根据数据结构的大小,用户可能会或不会感知到UI是如何在页面加载时由于这个计算任务而阻塞的。考虑衡量一下。

在JS数组可以被视为序列之间,关键字键在ClojureScript中不像在Clojure中那么强大(这里他们不实现IFn),实际上没有在这种特殊情况下,EDN比JSON有很多优势。

至于迭代,虽然映射/向量不是惰性的,但Clojure(Script)的数据处理函数(map/filter/etc) 的结果返回惰性序列-并以这种方式生成中间集合。

你可以通过使用最近移植的reducers库和transient/persistent!设施(如果这在你的应用程序中是一个实际问题)来避免相关的开销。