LINUX.ORG.RU

Как выбрать endianness?


0

0

Нужно сохранить в файл много целых чисел, кроссплатформенно.

За Big endian то, что это сетевой порядок байт, вроде как он считается платформонезависимым.

За Little endian то, что он чаще встречается, и накладных расходов на перекодирование не будет (скорость важна).

Что правильнее?

★★★★

Последнее исправление: unsigned (всего исправлений: 1)
Ответ на: комментарий от arsi

>хз, зависит от самого чипа, наверное. в атмел (ат91), с которым я сейчас работаю, переключалки порядка байт для памяти я не обнаружил

И не обнаружишь - arm это регистровая архитектура, ядро работает только с регистрами. LE | BE для ядра фиолетово, режим влияет только на команды ldr, str (загрузка/выгрузка регистров и внешней памяти), переключается это в сопроцессоре CP15. Режим больше проблема для периферийных блоков - чаще всего они работают в LE.

anonymous
()

Используй HDF и не страдай хернёй.

vasilenko ★★
()

> За Little endian то, что он чаще встречается, и накладных расходов на перекодирование не будет (скорость важна).

Переворот байтов на x86 - одна инструкция процессора — bswap. Очень быстро.

Если же делать разнобайтовый формат фала (с глоб. флагом - надо переворачивать или нет) то придётся делать ветвление каждый раз при считывании числа. (ветвление - зло по производительности что бы там ни говорили). Либо нужно будет делать втвление один раз (при выставлении указателей на функции-читалки). Тогда будут indirect-callы, что еще злее.

Весь сетевой стек работает через bswap и ничо, нормально.

mmarkk ★
()
Ответ на: комментарий от PolarFox

Маки не ломаются. и не глючат. особенно старые. Вот у меня Color Classic под доебаном MP3 играет даже! (M68k!)

mmarkk ★
()
Ответ на: комментарий от mmarkk

> Если же делать разнобайтовый формат фала (с глоб. флагом - надо переворачивать или нет) то придётся делать ветвление каждый раз при считывании числа

Не нужно.

Либо нужно будет делать втвление один раз (при выставлении указателей на функции-читалки). Тогда будут indirect-callы

Тоже не нужно.

Весь сетевой стек работает через bswap и ничо, нормально.

А как же indirect-call'ы?!!!11

tailgunner ★★★★★
()
Ответ на: комментарий от mmarkk

>Переворот байтов на x86 - одна инструкция процессора — bswap. Очень быстро.

Ну это гонево, во первых работает это только с 32 битами (для 16 уже не подходит) а во вторых про DMA можно уже забыть.

anonymous
()
Ответ на: комментарий от anonymous

> работает это только с 32 битами (для 16 уже не подходит)

16 бит не нужны. Компактность и скорость - взаимоисключающие вещи. Если надо компактно и без распаковщика, то про скорость 32-битных операций можно забыть. Короче нужна очень подробная специфика того чо надо с числами делать.

про DMA можно уже забыть

ну и делай DMA. а потом в цикле bswap

mmarkk ★
()
Ответ на: комментарий от mmarkk

> > про DMA можно уже забыть

ну и делай DMA. а потом в цикле bswap

Вернее, memcpy_bswap(), так как mmap() ты будешь вызывать так чтобы он форкал страницу при попытке изменения. А это приводит к memcpy() в ведре. Поэтому лучше сделать его самому а ммапить исключительно в RO режиме.

mmarkk ★
()
Ответ на: комментарий от mmarkk

>ну и делай DMA. а потом в цикле bswap

Хехе, кому нужен такой DMA ? Скорость и програмный перекодировщик буферов — взаимоисключающие вещи.

anonymous
()
Ответ на: комментарий от tailgunner

тогда как же сделать чтобы на всех платформах было быстро? Предположим, что ТЗ такое, что файл может быть получен из программ, работающих на разных платформах.

mmarkk ★
()
Ответ на: комментарий от mmarkk

> тогда как же сделать чтобы на всех платформах было быстро?

Написать столько функций перекодировки, сколько надо.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

> Написать столько функций перекодировки, сколько надо.

вот я и говорю: mmap + memcpy_bswap на одной платформе, просто mmap на другой.

mmarkk ★
()
Ответ на: комментарий от tailgunner

> хотя всем пофиг

Ну это смотря сколько данных и чо с ними потом делать будут — в некоторых случаях загрузка может быть узким местом. Вдруг сортировать надо?

mmarkk ★
()
Ответ на: комментарий от mmarkk

>> Написать столько функций перекодировки, сколько надо.

вот я и говорю

Ты говоришь вот эту глупость:

mmarkk> Если же делать разнобайтовый формат фала (с глоб. флагом - надо переворачивать или нет) то придётся делать ветвление каждый раз при считывании числа

Ветвление нужно будет сделать всего одно на файл.

mmap + memcpy_bswap

Знатоки низкого уровня всегда вызывали у меня умиление.

Ну это смотря сколько данных и чо с ними потом делать будут

Что бы с ними не делали, их нужно сначала валидировать. И на валидации ты потеряешь столько, что весь пустой треп о ветвлениях и косвенных вызовах становится совсем пустым трепом.

tailgunner ★★★★★
()
Ответ на: комментарий от mmarkk

Тогда не нужно искать «правильный» endianness.

bbk123 ★★★★★
()
Вы не можете добавлять комментарии в эту тему: топик перемещен в архив.