2013-02-06 3 views
12

나는 가변적 인 Buffer을 사용하고 있으며 얼마나 많은 요소가 있는지 알아야합니다.스칼라 버퍼 : 크기 또는 길이?

sizelength 방법은 분리 된 형질로부터 유전된다.

실제 성능 차이가 있습니까? 아니면 정확한 동의어로 간주 될 수 있습니까?

+2

필자는 개인적으로 의미 론적 선택기이므로 선형 또는 순차적 인 경우에는'length' 만 사용하고, 그렇지 않은 경우에는'size' 만 사용합니다. –

답변

15

그들은 동의어, ArrayString에 대한 모음에 대한 sizelength을 가진 자바의 결정의 대부분 결과입니다. 하나는 항상 다른 하나의 관점에서 정의되며, 소스 코드를 보면 scaladoc에서 제공되는 링크를 쉽게 볼 수 있습니다. 정의 특성을 찾고 소스 코드를 열고 def size 또는 def length을 검색하면됩니다.

+0

감사합니다. 나는 소스 코드가 scaladoc을 통해 온라인으로 액세스 할 수 있다는 것을 몰랐다. 이것은 아주 좋습니다! – Eduardo

2

그들은 Buffer.size 상태의 scaladoc로서 동의어 : 길이

이 버퍼의 크기는 등가. Buffer.length에 대한

scaladoc 은 명시 적으로 너무 :

버퍼의 길이입니다. 주 : xs.length와 xs.size는 동일한 결과를 산출합니다.

간단한 조언 : 질문하기 전에 scaladoc을 참조하십시오.

업데이트 : 실적을 언급 한 내용을 추가했습니다. Daniel C. Sobral의 원조로, 일반적으로 하나는 항상 다른 하나의 용어로 구현되므로 동일한 성능을 갖습니다.

+0

성능 차이가 있는지 궁금한가요? 예를 들어, 하나는 데이터 구조에 실제 속성으로 저장되는 반면, 다른 값은 List와 같은 모든 값을 반복하여 동일한 값을 반환해야합니다. – Eduardo

+0

좀 더 명시 적으로 내 질문을 편집했습니다. – Eduardo

5

이 경우 동의어로 간주 될 수 있습니다. Array과 같은 다른 경우에는주의해야 할 수 있습니다. 길이와 크기가 항상 동일한 결과를 반환하는 반면 Scala 2.10 이전 버전에서는 size (스칼라 래퍼에 의해 제공되는)에 대한 복싱 오버 헤드가있을 수 있습니다. Array)이며, length은 기본 Java Array에서 제공합니다.

스칼라 2.10에서이 오버 헤드는 size 메서드를 제공하는 값 클래스를 사용하여 제거되었으므로 원하는 방법을 자유롭게 사용할 수 있습니다.

+0

저는 스칼라 2.11 코드를 프로파일 링했으며 배열에서'size'를 호출하면 객체가 만들어집니다. 성능에 민감한 코드에서는이를 피해야합니다. – mattg

2

Scala-2.11부터 의 성능이 서로 다릅니다. 약 2,423,834 나노의 시간을 제공합니다 (때때로 다름) 내 AMD64의 컴퓨터에서 실행

val bigArray = Array.fill(1000000)(0) 
val beginTime = System.nanoTime() 
var i = 0 
while (i < 2000000000) { 
    i += 1 
    bigArray.length 
} 
val endTime = System.nanoTime() 
println(endTime - beginTime) 
sys.exit(-1) 

예를 들어,이 코드를 고려하십시오.

이제 length 메서드를 size으로 변경하면 약 70764719 나노 시간이됩니다.

보다 느림 이상입니다.

왜 발생합니까? 나는 그것을 파헤 치지 않았다, 나는 모른다.그러나 lengthsize이 크게 다른 경우 시나리오가 있습니다.