Число с плавающей запятой против целого числа:
Исторически сложилось, что с плавающей точкой гораздо медленнее, чем целочисленная арифметика. На современных компьютерах это больше не так (на некоторых платформах это происходит несколько медленнее, но если вы не напишите идеальный код и оптимизируете его для каждого цикла, разница будет подавлена другими недостатками в вашем коде).
На некоторых ограниченных процессорах, таких как в высокопроизводительных сотовых телефонах, с плавающей точкой может быть несколько медленнее, чем целочисленная, но обычно она находится в пределах порядка (или лучше), при условии, что доступна аппаратная плавающая точка , Стоит отметить, что этот разрыв довольно быстро сокращается, поскольку мобильные телефоны призваны выполнять все более общие вычислительные нагрузки.
На очень ограниченных процессорах (дешевые сотовые телефоны и тостер), как правило, нет аппаратного обеспечения с плавающей запятой, поэтому операции с плавающей запятой необходимо эмулировать в программном обеспечении. Это медленно - на пару порядков медленнее, чем целочисленная арифметика.
Как я уже сказал, люди ожидают, что их телефоны и другие устройства будут вести себя все больше и больше как "настоящие компьютеры", и разработчики оборудования быстро наращивают число процессоров, чтобы удовлетворить этот спрос. Если вы не гонитесь за каждым последним циклом или не пишете код для очень ограниченных процессоров, которые практически не поддерживают плавающую точку, различие в производительности для вас не имеет значения.
Целочисленные типы различных размеров:
Как правило, ЦП быстрее всего работают с целыми числами их собственного размера слова (с некоторыми оговорками о 64-битных системах). 32-разрядные операции часто выполняются быстрее, чем 8- или 16-разрядные операции на современных процессорах, но это довольно сильно различается в зависимости от архитектуры. Также помните, что вы не можете рассматривать скорость процессора изолированно; это часть сложной системы. Даже если работа с 16-разрядными числами в 2 раза медленнее, чем с 32-разрядными числами, вы можете поместить данные в иерархию кэша вдвое больше, если представите их с помощью 16-разрядных чисел вместо 32-разрядных. Если это делает разницу между тем, что все ваши данные поступают из кеша, а не с частыми пропусками кеша, то более быстрый доступ к памяти превзойдет медленную работу ЦП.
Другие примечания:
Векторизация улучшает баланс в пользу более узких типов (float
и 8- и 16-битных целых) - вы можете выполнять больше операций с вектором одинаковой ширины. Тем не менее, хороший векторный код написать сложно, поэтому это не значит, что вы получите это преимущество без особой тщательной работы.
Почему существуют различия в производительности?
На самом деле только два фактора влияют на то, является ли операция быстрой на ЦП: сложность схемы операции и потребность пользователя в быстрой операции.
(в пределах разумного) любая операция может быть выполнена быстро, если разработчики микросхем готовы выбросить достаточное количество транзисторов для решения проблемы. Но транзисторы стоят денег (или, скорее, использование большого количества транзисторов делает ваш чип больше, что означает, что вы получаете меньше чипов на пластину и меньший выход, что стоит денег), поэтому разработчики чипов должны сбалансировать, какую сложность использовать для каких операций, и они делают это на основе (предполагаемого) пользовательского спроса. Грубо говоря, вы можете разбить операции на четыре категории:
high demand low demand
high complexity FP add, multiply division
low complexity integer add popcount, hcf
boolean ops, shifts
Операции с высоким спросом и низкой сложностью будут быстрыми практически на любом процессоре: они являются низко висящим плодом и обеспечивают максимальную выгоду для пользователя для каждого транзистора.
Операции с высокими требованиями и высокой сложностью будут быстрыми на дорогих процессорах (например, используемых в компьютерах), потому что пользователи готовы платить за них. Вы, вероятно, не готовы платить лишние 3 доллара за тостер за быстрое умножение FP, поэтому дешевые процессоры будут экономить на этих инструкциях.
Операции с низкими требованиями и высокой сложностью обычно выполняются медленно почти на всех процессорах; просто не хватает выгоды, чтобы оправдать стоимость.
Операции с низким спросом и низкой сложностью будут быстрыми, если кто-то потрудится подумать о них, и вообще не будут существовать.
Дополнительная информация:
- Agner Fog поддерживает замечательный веб-сайт с множеством обсуждений подробностей о низкоуровневой производительности (и имеет очень научную методологию сбора данных для его поддержки).
- Intel®Справочное руководство по оптимизации архитектур 64 и IA-32 (ссылка на скачивание PDF находится на полпути вниз по странице) также охватывает многие из этих проблем, хотя сфокусировано на одной конкретной группе архитектур.