Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ByteBuffer или byte []? 
:(
    Опции темы
Sleepy_PIP
Дата 28.9.2010, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 512
Регистрация: 30.6.2004
Где: Moscow

Репутация: 4
Всего: 12



Подскажите пожалуста:
Надо определиться что луше использовать - ByteBuffer или byte[].
Задачка характеризуется частым получением и освобождением небольших буферов (до 10к) для чтения и записи (файлы и потоки). Работа с отдельными байтами буферов наличествует но не столь значительна - в основном именно получение, чтение/запись и высвобождение буферов.
Что с точки зрения скорости и потребления прочих ресурсов (ну к примеру нагрузка на gc или на ОС) будет более предпочтительно использовать в подобном случае?
Спасибо!




--------------------
--
Sleepy_PIP. Pavel Pryazhentsev (ex. 2:5020/141) "... Лучше быть нужным, чем
свободным ..."
PM MAIL ICQ   Вверх
COVD
Дата 28.9.2010, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 17
Всего: 43



ByteBuffer = byte[] + some usefull methods.
PM MAIL   Вверх
Sleepy_PIP
Дата 28.9.2010, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 512
Регистрация: 30.6.2004
Где: Moscow

Репутация: 4
Всего: 12



Цитата(COVD @ 28.9.2010,  17:41)
ByteBuffer = byte[] + some usefull methods.

Большое спасибо за отклик. но ....
может быть я чего-то непонимаю, но позвольте с Вами не согласиться.
вот дока:
Byte buffers can be created either by allocation, which allocates space for the buffer's content, or by wrapping an existing byte array into a buffer. Direct vs. non-direct buffers

A byte buffer is either direct or non-direct. Given a direct byte buffer, the Java virtual machine will make a best effort to perform native I/O operations directly upon it. That is, it will attempt to avoid copying the buffer's content to (or from) an intermediate buffer before (or after) each invocation of one of the underlying operating system's native I/O operations.
A direct byte buffer may be created by invoking the allocateDirect factory method of this class. The buffers returned by this method typically have somewhat higher allocation and deallocation costs than non-direct buffers. The contents of direct buffers may reside outside of the normal garbage-collected heap, and so their impact upon the memory footprint of an application might not be obvious. It is therefore recommended that direct buffers be allocated primarily for large, long-lived buffers that are subject to the underlying system's native I/O operations. In general it is best to allocate direct buffers only when they yield a measureable gain in program performance.
A direct byte buffer may also be created by mapping a region of a file directly into memory. An implementation of the Java platform may optionally support the creation of direct byte buffers from native code via JNI. If an instance of one of these kinds of buffers refers to an inaccessible region of memory then an attempt to access that region will not change the buffer's content and will cause an unspecified exception to be thrown either at the time of the access or at some later time.
Whether a byte buffer is direct or non-direct may be determined by invoking its isDirect method. This method is provided so that explicit buffer management can be done in performance-critical code. Access to binary data
This class defines methods for reading and writing values of all other primitive types, except boolean. Primitive values are translated to (or from) sequences of bytes according to the buffer's current byte order, which may be retrieved and modified via the order methods. Specific byte orders are represented by instances of the ByteOrder class. The initial order of a byte buffer is always BIG_ENDIAN.


из чего следует что даже самоя природа хранения данных у этих классов совершенно разная особенно в части direct направления. более того - ByteBuffer может храниться за адресным пр-вом занятым JVM в отличии от byte [].  Разве не так? может быть как раз direct и более эффективен чем использованеи byte[] который внутри JVM и навреняка на стеке живет. а?
Например  вариант отноительно разгрузить gc - использование скажем 1 (ну или другими словами - гораздо меньшего в данном случае) ByteBuffer вместо постоянных пересоздаваний и освобождений byte[] - правда это потребует чо-то типа realloc и clear но это уже в случае с direct - на уровне ОС. нет? ... но еще видя что ByteBuffer может быть  BIG_ENDIAN or LITTLE_ENDIAN причем не на момент преобразования данных в него и из него (тоесть ордер является свойством каждого объекта ByteBuffer-а)  - напрашивается вывод что относительно byte[] все методы доступа к содержимому ByteBuffer как минимум осуществляют проверку на ордер байт и соотв. преобразования в случаее необходимости - тоесть это еще и дольше. нет, не верно?

Я посему и вот и спрашиваю тут ... или все-ж Вы правы абсолютно точно? ... отчего-ж тогда Array и Arrays просто не расширили ... хм ...





--------------------
--
Sleepy_PIP. Pavel Pryazhentsev (ex. 2:5020/141) "... Лучше быть нужным, чем
свободным ..."
PM MAIL ICQ   Вверх
dobrolub
Дата 28.9.2010, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 385
Регистрация: 18.12.2009
Где: Vancouver, Canada

Репутация: 11
Всего: 16



Похоже ответ есть в тексте документации:

Цитата
In general it is best to allocate direct buffers only when they yield a measureable gain in program performance.


надо замеры делать.
PM   Вверх
COVD
Дата 28.9.2010, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 17
Всего: 43



Где-то на Апаче я видел утверждение, что не-директ, т.е. ByteBuffer.allocate(),  быстрее работает. А это и есть полная аналогия byte[] плюс удобные методы для манипуляций с байтами. Перейти при необходимости на ByteBuffer.allocateDirect() легко - отредактировать одну строку.

Цитата

... но еще видя что ByteBuffer может быть  BIG_ENDIAN or LITTLE_ENDIAN причем не на момент преобразования данных в него и из него .... как минимум осуществляют проверку на ордер байт  

Не делается там никакой проверки, я предполагаю. Просто не нужна она.  ByteBuffer конвертирует байты в целые числа и наоборот так, как указано при создании обьекта ByteBuffer.

Это сообщение отредактировал(а) COVD - 28.9.2010, 22:53
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0498 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.