我正在使用Clojure数据结构,但我没有使用任何惰性评估。在任何地方使用懒惰结构会有性能损失吗?Clojure懒惰结构与哈希/集合/向量的性能?
6
A
回答
4
从源代码:
clojure.lang.Cons
(严格列表元素,clojure.lang.PersistentList
很相似),https://github.com/clojure/clojure/blob/1.2.0/src/jvm/clojure/lang/Cons.java#L34
public Object first(){
return _first;
}
clojure.lang.LazySeq
(懒惰序列元素),https://github.com/clojure/clojure/blob/1.2.0/src/jvm/clojure/lang/LazySeq.java#L77
public Object first(){
seq();
if(s == null)
return null;
return s.first();
}
其中
final synchronized Object sval(){
if(fn != null)
{
try
{
sv = fn.invoke();
fn = null;
}
catch(Exception e)
{
throw new RuntimeException(e);
}
}
if(sv != null)
return sv;
return s;
}
final synchronized public ISeq seq(){
sval();
if(sv != null)
{
Object ls = sv;
sv = null;
while(ls instanceof LazySeq)
{
ls = ((LazySeq)ls).sval();
}
s = RT.seq(ls);
}
return s;
}
所以你是绝对是付出代价。它很大程度上取决于每个特定用例的价格对您的影响程度,以及它是否被内存节省和缺乏懒惰评估为您购买的浪费计算所抵消。
3
有一个懒惰结构的开销(pmjordan的答案是伟大的给你血淋淋的细节.....)。我非常粗略的估计是你支付2-5倍的罚款。
然而,也有一些上升空间:
- 懒惰计算意味着数据的工作集可能更小,因为需要的时候,才会创建。这可能提高您的缓存利用率,并因此在某些情况下提高性能
- 延迟评估可帮助您编写更简单,更干净的代码。所以你可以专注于编写更好的算法。拥有更好算法(例如O(n log n)vs O(n^2))的好处可能比懒惰评估的开销多得多
我的建议是使用懒惰评估除非你确定你处于一种真正需要高性能并且无法负担开销的情况下(例如图像处理或类似的东西....)
相关问题
- 1. 按clojure中的哈希映射的懒惰序列排序
- 2. 哈希表上的懒惰删除
- 3. Java中的懒惰集合
- 4. 填充导航属性集合懒惰
- 5. Clojure中最简单的懒惰功能
- 6. EF懒惰载入集合
- 7. 关于Clojure的懒惰
- 8. CakePHP 2.1哈希与集合
- 9. Clojure素数懒惰序列
- 10. 在实体框架中加载懒惰集合太懒惰
- 11. 结合哈希
- 12. 构建数据结构 - 哈希数组的哈希哈希
- 13. 休眠懒惰初始化 - 未能懒惰地初始化集合
- 14. 带懒惰集合的Hibernate LazyInitializationException
- 15. JpaRepository:取特定的懒惰集合
- 16. ORMLite和懒惰集合的问题
- 17. F#懒惰评估与非懒惰
- 18. Clojure的合并在哈希表键值
- 19. Clojure的,懒惰的评价问题
- 20. JPA Hibernate集合不是懒惰加载
- 21. 休眠:懒惰集合和session.merge
- 22. clojure.java.jdbc /查询大型结果集懒惰
- 23. Clojure的递归和懒惰序列
- 24. 是不是真的懒惰在clojure?
- 25. 重新实现Clojure的懒惰SEQ
- 26. 排序的哈希集合
- 27. scala懒惰的平行集合(是可能的?)
- 28. 为什么Clojure的core.reducers比懒惰的收集函数更快
- 29. 为什么懒惰生成Java String哈希码?
- 30. 懒惰加载批量数据集Keras