toArray с предварительно заданным размером массива - PullRequest
0 голосов
/ 13 ноября 2018

при использовании ar.toArray(new String[ar.size()]) Android studio 3.2.1 предупреждает о массиве предварительно заданного размера и рекомендует пустой массив :

Существует два стиля для преобразования коллекции в массив: либо с использованием предварительно настроенный массив (например, c.toArray (new String [c.size ()])) или использование пустой массив (например, c.toArray (new String [0]). В более старых версиях Java было рекомендовано использовать предварительно заданный массив, так как вызов отражения Нужно было создать массив нужного размера довольно медленно. тем не мение после поздних обновлений OpenJDK 6 этот вызов был производительность пустой версии массива такая же, а иногда даже лучше, по сравнению с предварительно настроенной версией. Также прохождение предварительно размера массив опасен для одновременной или синхронизированной коллекции как возможна гонка данных между размером и вызовом toArray, который может привести к дополнительным нулям в конце массива, если коллекция была одновременно сокращается во время операции. Эта проверка позволяет следовать единому стилю: либо использовать пустой массив (который рекомендуется в современной Java) или с использованием массива предварительно заданного размера (который может быть быстрее в старых версиях Java или JVM, не основанных на HotSpot).

это правда для Android или только для Java?

с использованием массива предварительного размера (который может быть быстрее в старых версиях Java или не основанные на HotSpot JVM).

потому что я думаю, что Android не является HotSpot, его виртуальная машина была Dalvik, а теперь это ART

Ответы [ 3 ]

0 голосов
/ 13 ноября 2018

Хороший вопрос.

https://shipilev.net/blog/2016/arrays-wisdom-ancients/#_new_reflective_array

Итог : toArray(new T[0]) кажется более быстрым, безопасным и более чистым по контракту, и поэтому должно бытьвыбор по умолчанию сейчас.Будущие оптимизации виртуальных машин могут закрыть этот разрыв в производительности для toArray(new T[size]), сделав текущие, «считающиеся оптимальными», использование на уровне фактически оптимального. Дальнейшие улучшения в toArray API будут следовать той же логике, что и toArray(new T[0]) - сама коллекция должна создать соответствующее хранилище.

0 голосов
/ 16 декабря 2018

он читает since late updates of OpenJDK 6, и не имеет значения, какое время выполнения используется для его запуска - потому что языковой уровень кода, который выполняется как скомпилированные классы в Dalvik, может быть Java 6, 7, 8. имеет значение только то, какой уровень языка используется проектом для его компиляции. например:

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

настройка JavaVersion.VERSION_1_6 может даже отключить жалобу на проверку ... исправление проблем производительности на этих устаревших устройствах, вероятно, не стоит усилий - и некоторые / большинство могут даже не быть затронуты, потому что только "более ранние обновления" ведут себя иначе чем все, что последовало.

0 голосов
/ 13 ноября 2018

Я не являюсь историком Java, но ...

HotSpot, по-видимому, по сути является торговой маркой для определенного вида JVM, поддерживаемого и распространяемого Oracle.Он получил свое название от своевременного компилятора, который может обнаружить «горячие точки» часто выполняемого кода и оптимизировать их на лету.

Среда выполнения Android также имеет такое поведение JIT-компилятора, как изаблаговременная компиляция байт-кода Java во встроенный машинный код во время установки.

Это заставляет меня думать, что ART относится к той же категории, что и HotSpot (насколько это касается проверки), и, следовательно, что выследует использовать версию этого вызова с «пустым массивом».


Если сомневаетесь, измерьте!

Лучший способ узнать наверняка - написать тестовую программу, которая выполняет обе версииметода и мер, который работает быстрее.


Источники:

...