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 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.