我正在使用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. Clojure中最简单的懒惰功能
- 3. EF懒惰载入集合
- 4. 关于Clojure的懒惰
- 5. Clojure素数懒惰序列
- 6. 在实体框架中加载懒惰集合太懒惰
- 7. 带懒惰集合的Hibernate LazyInitializationException
- 8. JpaRepository:取特定的懒惰集合
- 9. ORMLite和懒惰集合的问题
- 10. Clojure的合并在哈希表键值
- 11. Clojure的,懒惰的评价问题
- 12. JPA Hibernate集合不是懒惰加载
- 13. 排序的哈希集合
- 14. Clojure的递归和懒惰序列
- 15. 重新实现Clojure的懒惰SEQ
- 16. 为什么懒惰生成Java String哈希码?
- 17. scala懒惰的平行集合(是可能的?)
- 18. 为什么Clojure的core.reducers比懒惰的收集函数更快
- 19. Clojure构建2D哈希映射
- 20. Ruby集合哈希集合中的选择性值
- 21. 懒惰加载批量数据集Keras
- 22. 懒惰量词和向前看
- 23. 数据结构请求:懒惰无限集
- 24. 什么命名结构包含哈希表和向量?
- 25. C++无序集设置问题与结构哈希
- 26. 迭代哈希集合
- 27. 懒惰加载不与NHibernate合作
- 28. 作为矢量的Clojure惰性序列
- 29. 通过将非惰性集合转换为流,懒惰评估有多容易?
- 30. Clojure的 - 功能没有返回一个懒惰的序列