我正在使用ClojureScript应用程序中的大JSON文件(基本上包含树状结构)。基本上我遍历那个树结构中的所有元素,这些是相当多的操作。现在我想知道Lazy Hash地图处理会带来多少开销。
基本上我:
JSON.parse
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
似乎是一个可行的循环选项。是吗?
答案 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!
工具(如果这在您的应用中成为实际问题)来避免相关的开销