Форум 3DNews
Вернуться   Форум 3DNews > Программирование > Программирование

Ответ Создать новую тему
Опции темы Опции просмотра
Непрочитано 12.12.2004, 07:16   [включить плавающее окно]   #1
404
Мужской Умудрённый
Автор темы
 
Регистрация: 04.08.2003
Насколько быстро C++ работает с битовыми полями?

Пользуюсь Borland C++ Builder 5, но если компилятор Visual С++ обеспечивает более быструю (так мне сказали) рабту с битовыми полями, перейду на него.

Ситуация:

Есть данные, ака массив структур из 8 целых чисел. Они 1 раз читаются с диска. После этого с ними многократно производятся вычисления, из которых ~2% это сравнение двух структур.

Варианты:

1. Держать структуру как массив int[8]. Тогда на диске она займёт 32 байта. Нехорошо.

2. Держать структуру как массив short int[8]. Тогда на диске она займёт 16 байт. Сравнить 2 структуры можно будет в 2 раза быстрей (сравнивать по 4 байта за раз). Но вычисления с элементами структур слегка замедлятся(?), из-за преобразований int <-> short int.

3. Держать структуру как битовое поле! Она удачно упаковывается аккурат в 8 байт. Сравнить две структуры можно просто как два unsigned __int64! Но при вычислениях с элементами структуры будет ещё большее замедление из-за упаковки/распаковки битового поля.

Вопрос: насколько велики потери скорости при работе с битовыми полями?

Спасибо.

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

Последний раз редактировалось 404; 12.12.2004 в 07:19.
404 вне форума  
Конфигурация ПК
Ответить с цитированием
Непрочитано 13.12.2004, 15:22   [включить плавающее окно]   #2
Sanya
Мужской Опытный
 
Аватар для Sanya
 
Регистрация: 22.03.2003
Адрес: Апатиты
Советую выбрать вариант 2. ИМХО, преобразования int <-> short int если и будут иметь место, то это не медленнее распаковки битового поля. Ну и, опять же, удобнее работать.
__________________
Лечить и судить умеют и могут все, а вот рассчитать несущую балку?
Sanya вне форума  
Конфигурация ПК
Ответить с цитированием
Непрочитано 14.12.2004, 01:57   [включить плавающее окно]   #3
404
Мужской Умудрённый
Автор темы
 
Регистрация: 04.08.2003
Sanya
Хех, мне-то как раз, в моей конкретной задаче, удобнее с битовым полем. Вопрос, 1) насколько распаковка/запаковка медленнее, чем просто доступ к элементу структуры; 2) насколько запаковка/распаковка медленнее чем short int <-> int?

Lawrence Crowl, Sun ONE Studio Solaris Tools Development Engineering: "The cost of reading bit-fields depends primarily on how much instruction parallelism is available, while the cost of writing bit-fields is usually double the cost of writing a non-bit-field."
404 вне форума  
Конфигурация ПК
Ответить с цитированием
Непрочитано 14.12.2004, 11:56   [включить плавающее окно]   #4
Sanya
Мужской Опытный
 
Аватар для Sanya
 
Регистрация: 22.03.2003
Адрес: Апатиты
404
ну сам прикинь.. преобразование типа будет сводиться к добавлению нолика в старшую часть регистра при операциях с коротким интом -- это всего одна инструкция (если, конечно, число положительное). Ну а битовые поля -- это как правило несколько логических операций (И, ИЛИ, побитовый сдвиг), плюс к этому всё равно нужно будет делать подгонку типов после распаковки данных. Ну а доступ к структуре -- просто к адресу структуры прибавляется заданное смещение, и получаем адрес, по которому нужно обращаться.

Хотя на самом деле -- хрен его знает, во что это всё будет преобразовано компилятором.. Для внесения ясности в этот вопрос советую написать две тестовых проги с несколькими операциями над массивом и битовым полем соответственно, и потом покопаться дизассемблером.
Или погонять операции в длиннющем цикле с замером производительности (по счетчику тактов CPU, например).
__________________
Лечить и судить умеют и могут все, а вот рассчитать несущую балку?
Sanya вне форума  
Конфигурация ПК
Ответить с цитированием
Непрочитано 15.12.2004, 01:10   [включить плавающее окно]   #5
404
Мужской Умудрённый
Автор темы
 
Регистрация: 04.08.2003
Sanya
Судя по .exe Borland добавляет на одну операцию доступа к битовому полю ~десятки байт кода.
...потом покопаться дизассемблером.
А Borland Builder 5 ассемблерный листинг не выдаёт?

Мне сказали что Microsoft Visual C++ производит меньше кода при работе с битовыми полями (и вообще делает более маленькие exe-шники). Если так, и если особого преимущества в быстродействии получающихся программ у Borland vs Visual С++ нет, перейду на последний.
404 вне форума  
Конфигурация ПК
Ответить с цитированием
Непрочитано 15.12.2004, 02:42   [включить плавающее окно]   #6
Johnnie Walker
Опытный
 
Регистрация: 28.04.2004
404, такое впечатление, что битовое поле у Вас стало целью. Целью должна быть "красота" ("правильность") и производителность. В Вашем случае сравнение - фактор маловлияющий на производительность, следовательно надо добиваться красоты. А битовые поля - самый кошмарный кошмар из всего, что может придумать высокоуровневый программист. Т. е. вопрос сводится к уровню задачи..
Johnnie Walker вне форума  
Ответить с цитированием
Ответ Создать новую тему

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 17:56. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 2000-2017 3DNews. All Rights Reserved.
Администрация 3DNews требует соблюдения на форуме правил и законов РФ
Серверы размещены в Hostkey