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
выполняют радикально разные.