2012-01-22 5 views
9

Недавно я узнал, что каждый цикл вычислений выполняется на машинных словах, которые на большинстве современных процессоров и ОС являются либо 32-разрядными, либо 64-разрядными. Итак, каковы преимущества использования меньших значений размера бит, таких как Int16, Int8, Word8? Для чего они предназначены? Это только сокращение памяти?Использование низкоразмерных интегральных типов типа `Int8` и то, что они предназначены для

Я пишу сложную программу расчета, которая состоит из нескольких модулей, но сопряжена только с одной функцией, которая возвращает значение Word64, поэтому вся программа выводит значение Word64. Меня интересует ответ на этот вопрос, потому что внутри этой программы я нашел много разных типов Integral, таких как Word16 и Word8, чтобы представлять небольшие объекты, и, видя, что они довольно часто конвертируются с fromIntegral, я подумал: ошибка там и какова была точная выгода тех типов, о которых я не знал, о которых слепо привлекало? Имело ли смысл вообще использовать другие интегральные типы и фактически конвертировать их с fromIntegral или, может быть, я должен был просто использовать Word64 всюду?

ответ

6

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

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

Что касается вопроса, следует ли использовать Word64 всюду или использовать меньшие типы, это зависит. В 64-разрядной системе при компиляции с оптимизацией производительность Word и Word64 должна быть в основном такой же, поскольку там, где это важно, оба должны быть распакованы, а работа выполняется на исходной машине Word#. Но, вероятно, есть еще несколько правил для Word, которые пока не имеют Word64, так что, возможно, есть разница.В 32-битной системе большинство операций на Word64 реализованы через C-вызовы, поэтому операции с Word64 - , намного меньше, чем операции на Word.

Поэтому в зависимости от того, что является более важным, простота кода или производительности на разных системах, либо

  1. использование Word64 во всем: простой код, хорошая производительность на 64-разрядных системах
  2. используют Word до тех пор, ваши значения гарантированно вписываются в 32 бита и преобразуются в Word64 в самый последний безопасный момент: более сложный код, но лучше производительность на 32-битных системах.
+0

Спасибо, Дэниел! Пожалуйста, рассмотрите комментарий, который я оставил на ответ Эгирда. Поскольку в целом ваши ответы схожи, он также обращается к вам. –

+0

Обновленный ответ. В зависимости от вашей ситуации и целей я могу не согласиться с этим. –

8

В GHC интегральные типы фиксированного размера занимают полное машинное слово, поэтому нет экономии пространства. Использование типов размерного слова (например, Int и Word) в большинстве случаев будет быстрее, чем типы фиксированного размера, но использование интегрального типа фиксированного размера будет быстрее, чем использование явного переноса.

Вы должны выбрать подходящий тип для диапазона значений, которые вы используете. maxBound :: Word8 - 255, 255 + 1 :: Word8 - 0 - и если вы имеете дело с октетами, это именно то, что вы хотите. (Например, ByteString s определены как хранение Word8 s.)

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

Таким образом, не используйте их для выполнения; используйте их, если вы ищете их конкретную семантику: интегральные типы фиксированного размера с определенным поведением переполнения.

+0

Как всегда вы и Даниэль на помощь!) Хорошо, так что обычно 'Int' и' Word' лучше, чем те маленькие типы - я получаю это. Но как насчет второго вопроса, который я указывал: будет ли еще эффективнее выполнять все внутренние операции в «Word», если я знаю, что в конечном итоге мне все же придется увеличивать эти значения до «Word64» или в этом сценарии имеет смысл просто использовать «Word64» всюду с самого начала и, таким образом, освобождать некоторые циклы, устраняя конверсии 'fromIntegral'? –

+1

Если вы хотите создать результат «Word64», я бы использовал «Word64» для промежуточных вычислений. На 64-битной машине это будет машинное слово, поэтому не должно быть проблем с производительностью, а 'fromIntegral' будет NOP во время выполнения. – ehird

+0

Нет экономии пространства? Я думал, что с bangpatterns они будут экономить место в конструкторах данных. – user239558