2012-10-16 1 views
5

커다란 구조를 반복하면서 작은 점 (일반적으로 1 점, 때로는 1 점)을 추가하면서 큰 구조를 반복하면서 "작은"(예 : 짧은 문자열 또는 간단한 사례 클래스) 객체를 사용하여 세트와 맵을 사용하는 코드를 작성 중입니다. 소수) 개체를 설정 또는지도에 추가합니다. 변경 가능한 세트와 맵을 사용하면 변경 불가능한 세트와 맵을 사용하는 경우 속도가 크게 향상되는 것처럼 보이지만 차이점을 정량적으로 평가하는 데 문제가 있습니다.스칼라에서 불변 및 변경 가능한 세트와 맵을 가비지 수집과 비교하는 방법은 무엇입니까?

불변의 데이터 구조를 사용할 때 Scala의 가비지 콜렉션이 상당한 속도 저하를 일으키는 지 이해하고 있습니까? 변경할 수있는 데이터 구조를 사용하면이 문제를 해결할 수 있습니까?

답변

5

스칼라 변경 불가능 컬렉션은 놀라 울 정도로 효율적입니다. 주로 구조체가 변경되면 많은 구조체가 재사용되기 때문입니다.

하지만 변경 사항이 많으면 변경 가능한 구조가 더 적합 할 수 있습니다. 사실 이것은 Scala Collection API가 내부적으로 여러 곳에서하는 일입니다. 변경 가능한 데이터 구조를 사용하여 새로운 내용을 만들고 마지막 단계로만 변경할 수있는 객체를 만들고 반환합니다.

-1

스칼라 변경 가능한 메모리 구조는 메모리를 사전 할당하여 변경 불가능한 메모리 구조보다 효율성을 높입니다. 그들은 많은 삽입물에 더 잘 맞습니다 (따라서 왜 그들은 변경 가능합니다). 함수의 구현을 살펴보십시오 + =지도 확장 기본 변경 가능한 컬렉션,는 HashMap에서 :

https://github.com/scala/scala/blob/v2.9.2/src/library/scala/collection/mutable/HashMap.scala#L84

def += (kv: (A, B)): this.type = { 
    val e = findEntry(kv._1) 
    if (e == null) addEntry(new Entry(kv._1, kv._2)) 
    else e.value = kv._2 
    this 
} 

의 HashMap이 해시를 사용하여 변경 가능한 맵을 구현,

addEntry을 정의

https://github.com/scala/scala/blob/v2.9.2/src/library/scala/collection/mutable/HashTable.scala#L117

protected def addEntry(e: Entry) { 
    val h = index(elemHashCode(e.key)) 
    e.next = table(h).asInstanceOf[Entry] 
    table(h) = e 
    tableSize = tableSize + 1 
    nnSizeMapAdd(h) 
    if (tableSize > threshold) 
    resize(2 * table.length) 
} 

컬렉션의 크기는 임계 값에 도달 할 때마다 두 배로된다. 따라서 한 번에 하나의 항목 만 빈 변경 가능 데이터 구조에 반복적으로 추가하는 경우 log (n) 번만 조정하면됩니다. 불변의 데이터 구조 구현을 깊이 보지 않았지만 모든 삽입물에 대해 크기를 조정해야한다고 가정합니다. 따라서 당신의 성과 격차.

관련 문제