Scala Буфер: размер или длина?

Я использую mutable Buffer и вам нужно выяснить, сколько у него элементов.

Оба метода size и length определены, унаследованы от отдельных признаков.

Есть ли какая-либо фактическая разница в производительности, или они могут считаться точными синонимами?

Ответы

Ответ 1

Они являются синонимами, в основном результатом решения Java о наличии size для коллекций и length для Array и String. Один из них всегда будет определяться с точки зрения другого, и вы можете легко увидеть, что есть, смотря на исходный код, ссылка для которого предоставляется на scaladoc. Просто найдите определяющий признак, откройте исходный код и выполните поиск def size или def length.

Ответ 2

В этом случае их можно рассматривать как синонимы. Возможно, вам захочется следить за некоторыми другими случаями, такими как Array - в то время как длина и размер всегда будут возвращать один и тот же результат, в версиях до Scala 2.10 может быть накладные расходы бокса для вызова size (который предоставляется с помощью оболочки Scala вокруг массива), тогда как length предоставляется базовым массивом Java.

В Scala 2.10 эти служебные данные были удалены с помощью класса значений, предоставляющего метод size, поэтому вы можете свободно использовать любой способ, который вам нравится.

Ответ 3

Они являются синонимами, так как scaladoc для Buffer.size указывает:

Размер этого буфера, эквивалентный длине.

Скайдакок для Buffer.length тоже явный:

Длина буфера. Примечание: xs.length и xs.size дают тот же результат.

Простой совет: обратитесь к скалядоку, прежде чем задавать вопрос.

ОБНОВЛЕНИЕ. Просто просмотрите свое изменение, добавив упоминание о производительности. Как помощь Даниэля С. Собраля, обычно обычно выполняются с другой стороны, поэтому они имеют одинаковую производительность.

Ответ 4

Как и в случае с Scala -2.11, эти методы могут иметь разную производительность. Например, рассмотрите этот код:

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)

Запуск этого на моем компьютере amd64 дает время в 2423834 наноса (время от времени меняется).

Теперь, если я изменю метод length на size, он станет около 70764719 наносов.

Это больше, чем 20x медленнее.

Почему это происходит? Я не пропустил его, я не знаю. Но есть сценарии, где length и size выполняют радикально разные.