Это самый быстрый доступ к байту, чем немного? Зачем? - PullRequest
5 голосов
/ 16 октября 2011

Вопрос очень прямой: доступ к байту быстрее, чем к биту? Если я буду хранить 8 логических значений в байте, будет ли медленнее сравнивать их, чем если бы я использовал 8 байтов? Почему?

Ответы [ 6 ]

4 голосов
/ 16 октября 2011

Шансов нет.Наименьшая адресуемая единица памяти на большинстве машин сегодня - это байт.В большинстве случаев вы не можете адресовать или получать доступ по битам.

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

РЕДАКТИРОВАТЬ:

Ваш вопрос упоминает "сравнить", я не уверен, что именно вы подразумеваете под этим.Но в некоторых случаях вы выполняете логику очень эффективно на нескольких логических значениях, используя побитовые операторы, если ваши логические значения плотно упакованы в большие целочисленные типы.

Что для использования: массив байтов (содно логическое значение на байт) или плотно упакованная структура с одним логическим значением на бит - это компромисс между space-effiicency .Для некоторых приложений, которым необходимо хранить огромное количество bool-ов, лучше использовать плотную упаковку, поскольку она экономит память.

2 голосов
/ 16 октября 2011

Базовое оборудование, на котором работает ваш код, создано для доступа к байтам (или более длинным словам) из памяти.Чтобы прочитать немного, вы должны прочитать весь байт, а затем замаскировать биты, которые вам не нужны, и, возможно, также сдвинуть, чтобы получить бит в позицию единиц.Таким образом, инструкции для доступа к битам являются расширенным набором инструкций для доступа к байту.

1 голос
/ 04 октября 2015

Это зависит от типа шины данных процессора и материнской платы, то есть 32-битная шина данных будет сравнивать ваши данные быстрее, если вы соберете их в «слова», а не в «bool» или «байты» .... Этодопустимо только тогда, когда вы пишете на ассемблере, когда вы можете сравнить каждую инструкцию с тем, сколько циклов она занимает .... но так как вы используете компилятор, то это почти то же самое.Однако сбор логических значений в слова или целые числа будет полезен для экономии памяти, необходимой для переменных.

1 голос
/ 16 октября 2011

С аппаратной точки зрения я бы сказал, что в общем случае все битовые маски и другие операции в лучшем случае могут происходить в течение одного такта (в результате ничего не изменится), но это полностью зависит от аппаратного уровня, который вы, вероятно,никогда не буду знать специфику, и поэтому вы не можете рассчитывать на это.

Стоит отметить, что такие вещи, как .NET system.collections.bitarray, используют 32-битный целочисленный массив для хранения своих битовых данных.Вероятно, есть причина производительности за этой реализацией (даже если только в общем случае, когда 32-битные слова работают выше среднего), я бы посоветовал прочитать о внутренней работе, которая может быть показательной.

С точки кодированияс точки зрения, это действительно зависит от того, что вы собираетесь делать с битами потом.То есть, если вы собираетесь хранить ваши данные в логических значениях, таких как:

bool a0, a1, a2, a3, a4, a5, a6, a7;

А затем в своем коде вы сравниваете их один за другим (и большинство из них вместе):

if ( a0 && a1 && !a2 && a3 && !a4 && (!a5 || a6) || a7) {
...
}

Тогда вы обнаружите, что будет быстрее (и, вероятно, точнее в коде) использовать битовую маску.Но на самом деле единственный раз, когда это будет иметь значение, это если вы собираетесь запускать этот код миллионы раз в высокопроизводительной или критичной ко времени среде.делайте все, что говорят ваши стандарты кодирования (и если у вас их нет или они не учитывают такие подробности, просто делайте то, что выглядит наиболее подходящим для вашего приложения и потребностей).

Но я настоятельно рекомендую попытаться осмотретьсяи прочитайте блог или два, объясняющие внутреннюю работу .NET system.collections.bitarray.

1 голос
/ 16 октября 2011

Может быть быстрее хранить данные в виде битов по другой причине - если вам нужно пройти и получить доступ ко многим 8-битным наборам флагов подряд. Вы будете выполнять больше операций за логический флаг, но вы будете обходить меньше памяти, упаковав ее в меньшее количество байтов. Вы также сможете протестировать несколько флагов за одну операцию, хотя вы также можете до некоторой степени делать это с помощью bools, если они лежат в одном машинном слове.

Штраф задержки памяти намного выше, чем изменение регистра битов. В конце концов, только профилирование кода на оборудовании, на котором он будет работать, покажет вам, какой путь лучше.

0 голосов
/ 16 октября 2011

Компьютеры, как правило, получают доступ к вещам словами. Доступ к битам медленнее, потому что требует больше усилий:

Представьте, что я вам что-то сказал, а затем сказал: «О, вместо этого измените мое второе слово». Теперь представьте, что вместо этого я изменил: «о, поменяйте третью букву во втором слове на« s »».

Что требует от вас большего внимания?

...