32-битный ЦП - это ЦП, который обычно работает с 32-битными значениями внутри, но это не означает, что он медленнее при выполнении той же операции с 8/16-битным значением. Например, x86, все еще обратно совместимый до 8086, может работать с частями регистра. Это означает, что даже если регистр имеет ширину 32 бита, он может работать только с первыми 16 или первыми 8 битами этого регистра, и замедления не будет вообще. Эта концепция была даже принята x86_64, где регистры 64-битные, но они все еще могут работать только на первых 32, 16 или 8-битных.
Кроме того, x86-процессоры всегда загружают целую строку кэша из памяти, если она еще не находится в кэше, и строка кэша в любом случае больше 4 байтов (для 32-битных процессоров, а не 8 или 16 байтов), и, следовательно, загрузка 2 байтов из памяти одинаково быстро, как загрузка 4 байта из памяти. Если обрабатывать много значений из памяти, 16-битные значения могут на самом деле быть намного быстрее, чем 32-битные значения, так как происходит меньше передач памяти. Если строка кэша имеет длину 8 байт, в каждой строке кэша имеется четыре 16-битных значения, но только два 32-битных значения, поэтому при использовании 16-битных целых у вас один доступ к памяти на каждые четыре значения, а при использовании 32-битных целых у вас по одному на каждые два значения. , что приводит к удвоению числа передач для обработки большого массива int.
Другие процессоры, например, PPC, не могут обрабатывать только часть регистра, они всегда обрабатывают полный регистр. Тем не менее, эти процессоры обычно имеют специальные операции загрузки, которые позволяют им, например, загрузить 16-битное значение из памяти, расширить его до 32-битного и записать его в регистр. Позже у них есть специальная операция сохранения, которая берет значение из регистра и сохраняет в памяти только последние 16 бит; обе операции требуют только одного цикла ЦП, как и 32-битная загрузка / сохранение, поэтому разницы в скорости тоже нет. А поскольку PPC может выполнять только арифметические операции над регистрами (в отличие от x86, который также может работать непосредственно с памятью), эта процедура загрузки / сохранения выполняется в любом случае независимо от того, используете ли вы 32-битные или 16-битные.
Единственный недостаток, если вы объединяете несколько операций на 32-битном процессоре, который может работать только с полными регистрами, это то, что 32-битный результат последней операции может быть «урезан» до 16 бит до следующей операции. выполняется, иначе результат может быть неверным. Однако такое сокращение - это всего лишь один цикл ЦП (простая операция И), и компиляторы очень хорошо понимают, когда такое сокращение действительно необходимо и когда его исключение не повлияет на конечный результат. таким образом, такое сокращение не выполняется после каждой инструкции, оно выполняется, только если это действительно неизбежно. Некоторые процессоры предлагают различные «улучшенные» инструкции, которые делают такое сокращение ненужным, и я видел много кода в своей жизни, где я ожидал такого сокращения, но, глядя на сгенерированный код сборки, компилятор нашел способ Избегайте этого полностью.
Так что, если вы ожидаете здесь общего правила, мне придется вас разочаровать. Никто не может с уверенностью сказать, что 16-битные операции одинаково быстры для 32-битных операций, и никто не может с уверенностью сказать, что 32-битные операции всегда будут быстрее. Это зависит также от того, что именно ваш код делает с этими числами и как он это делает. Я видел тесты, в которых 32-битные операции выполнялись быстрее на определенных 32-битных процессорах, чем тот же код с 16-битными операциями, однако я также уже видел обратное. Даже переключение с одного компилятора на другой или обновление версии компилятора может уже все перевернуть. Я могу только сказать следующее: Кто бы ни утверждал, что работа с шортами значительно медленнее, чем работа с целыми числами, пожалуйста, предоставьте пример исходного кода для этого утверждения и назовите CPU и компилятор, который он использовал для тестирования, так как я никогда не испытывал ничего подобного в о последних 10 лет. Могут быть ситуации, когда работа с целыми числами может быть на 1-5% быстрее, но все, что ниже 10%, не является «значительным», и вопрос в том, стоит ли тратить вдвое больше памяти в некоторых случаях только потому, что это может купить вас 2% производительности? Я так не думаю.