我正在使用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