![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| Sleepy_PIP |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 512 Регистрация: 30.6.2004 Где: Moscow Репутация: 4 Всего: 12 |
Подскажите пожалуста:
Надо определиться что луше использовать - ByteBuffer или byte[]. Задачка характеризуется частым получением и освобождением небольших буферов (до 10к) для чтения и записи (файлы и потоки). Работа с отдельными байтами буферов наличествует но не столь значительна - в основном именно получение, чтение/запись и высвобождение буферов. Что с точки зрения скорости и потребления прочих ресурсов (ну к примеру нагрузка на gc или на ОС) будет более предпочтительно использовать в подобном случае? Спасибо! -------------------- -- Sleepy_PIP. Pavel Pryazhentsev (ex. 2:5020/141) "... Лучше быть нужным, чем свободным ..." |
|||
|
||||
| COVD |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 17 Всего: 43 |
ByteBuffer = byte[] + some usefull methods.
|
|||
|
||||
| Sleepy_PIP |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 512 Регистрация: 30.6.2004 Где: Moscow Репутация: 4 Всего: 12 |
Большое спасибо за отклик. но .... может быть я чего-то непонимаю, но позвольте с Вами не согласиться. вот дока: 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) "... Лучше быть нужным, чем свободным ..." |
|||
|
||||
| dobrolub |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 385 Регистрация: 18.12.2009 Где: Vancouver, Canada Репутация: 11 Всего: 16 |
Похоже ответ есть в тексте документации:
надо замеры делать. |
|||
|
||||
| COVD |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 17 Всего: 43 |
Где-то на Апаче я видел утверждение, что не-директ, т.е. ByteBuffer.allocate(), быстрее работает. А это и есть полная аналогия byte[] плюс удобные методы для манипуляций с байтами. Перейти при необходимости на ByteBuffer.allocateDirect() легко - отредактировать одну строку.
Не делается там никакой проверки, я предполагаю. Просто не нужна она. ByteBuffer конвертирует байты в целые числа и наоборот так, как указано при создании обьекта ByteBuffer. Это сообщение отредактировал(а) COVD - 28.9.2010, 22:53 |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |