ClojureScript哈希映射性能与Javascript对象
ClojureScript Hash Map performance vs. Javascript Objects
我在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!
设施(如果这在你的应用程序中是一个实际问题)来避免相关的开销。
- Chrome开发工具(如何知道我在调用哪个javascript对象)
- 循环遍历以数组为值的Javascript对象
- 从ajax请求中获取javascript对象
- 如何从对象的原型方法访问JavaScript对象属性
- 将XML转换为普通的旧JavaScript对象
- 通过引用传递JavaScript对象
- javascript对象操作:根据指定条件选择属性
- Javascript对象类在单击时打开窗口进行颜色选择,并在更改时替换对象背景颜色
- 如何在异步函数中使用javascript对象
- 临时Javascript对象
- 如何在ASP中为用户控件添加Javascript对象网
- 使用数组向下搜索Javascript对象
- Rails将JavaScript对象存储到Model的有效方式
- JavaScript对象不是从原型链继承的
- 如何创建具有默认值的JavaScript对象字段?(AngularJS模型相关)
- SetInterval在javascript对象中表现怪异
- Javascript 对象和 this 关键字
- 如何在不知道关键字的情况下访问javascript对象值
- 在 JavaScript 对象中设置要使用的运算符的属性
- 如何搜索JavaScript对象并更改值