나는 가변적 인 Buffer
을 사용하고 있으며 얼마나 많은 요소가 있는지 알아야합니다.스칼라 버퍼 : 크기 또는 길이?
size
과 length
방법은 분리 된 형질로부터 유전된다.
실제 성능 차이가 있습니까? 아니면 정확한 동의어로 간주 될 수 있습니까?
나는 가변적 인 Buffer
을 사용하고 있으며 얼마나 많은 요소가 있는지 알아야합니다.스칼라 버퍼 : 크기 또는 길이?
size
과 length
방법은 분리 된 형질로부터 유전된다.
실제 성능 차이가 있습니까? 아니면 정확한 동의어로 간주 될 수 있습니까?
그들은 동의어, Array
및 String
에 대한 모음에 대한 size
및 length
을 가진 자바의 결정의 대부분 결과입니다. 하나는 항상 다른 하나의 관점에서 정의되며, 소스 코드를 보면 scaladoc에서 제공되는 링크를 쉽게 볼 수 있습니다. 정의 특성을 찾고 소스 코드를 열고 def size
또는 def length
을 검색하면됩니다.
감사합니다. 나는 소스 코드가 scaladoc을 통해 온라인으로 액세스 할 수 있다는 것을 몰랐다. 이것은 아주 좋습니다! – Eduardo
그들은 Buffer.size
상태의 scaladoc로서 동의어 : 길이
이 버퍼의 크기는 등가.
Buffer.length
에 대한
scaladoc 은 명시 적으로 너무 :
버퍼의 길이입니다. 주 : xs.length와 xs.size는 동일한 결과를 산출합니다.
간단한 조언 : 질문하기 전에 scaladoc을 참조하십시오.
업데이트 : 실적을 언급 한 내용을 추가했습니다. Daniel C. Sobral의 원조로, 일반적으로 하나는 항상 다른 하나의 용어로 구현되므로 동일한 성능을 갖습니다.
이 경우 동의어로 간주 될 수 있습니다. Array
과 같은 다른 경우에는주의해야 할 수 있습니다. 길이와 크기가 항상 동일한 결과를 반환하는 반면 Scala 2.10 이전 버전에서는 size
(스칼라 래퍼에 의해 제공되는)에 대한 복싱 오버 헤드가있을 수 있습니다. Array)이며, length
은 기본 Java Array에서 제공합니다.
스칼라 2.10에서이 오버 헤드는 size
메서드를 제공하는 값 클래스를 사용하여 제거되었으므로 원하는 방법을 자유롭게 사용할 수 있습니다.
저는 스칼라 2.11 코드를 프로파일 링했으며 배열에서'size'를 호출하면 객체가 만들어집니다. 성능에 민감한 코드에서는이를 피해야합니다. – mattg
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 나노 시간이됩니다.
보다 느림 이상입니다.
왜 발생합니까? 나는 그것을 파헤 치지 않았다, 나는 모른다.그러나 length
과 size
이 크게 다른 경우 시나리오가 있습니다.
필자는 개인적으로 의미 론적 선택기이므로 선형 또는 순차적 인 경우에는'length' 만 사용하고, 그렇지 않은 경우에는'size' 만 사용합니다. –