32-битный процессор - это центральный процессор, который обычно работает с 32-битными значениями внутри, но это не означает, что при выполнении одной и той же операции при значении 8/16 бит он медленнее. x86, например, все еще обратная совместимость до 8086, может работать на долях регистра. Это означает, что даже если регистр имеет ширину в 32 бит, он может работать только на первом 16 или первом 8 бит этого регистра, и вообще не будет замедления. Эта концепция даже была принята x86_64, где регистры 64 бит, но они все еще могут работать только на первых 32, 16 или 8 бит.
Также x86 CPU всегда загружают целую строку кэша из памяти, если она еще не находится в кеше, и в то время как длина кеша больше 4 байта (для 32-битных процессоров - 8 или 16 байт) и, таким образом, загрузка 2 байта из памяти так же быстро, как загрузка 4 байта из памяти. Если обрабатывать многие значения из памяти, 16-разрядные значения могут быть намного быстрее, чем 32-битные значения, так как меньше переносов памяти. Если строка кэша составляет 8 байт, в строке кэша есть четыре 16-битных значения, но только два 32-битных значения, поэтому при использовании 16-битных ints у вас есть один доступ к памяти каждые четыре значения, используя 32-битные ints, у вас есть одно каждые два значения , что приводит к удвоенному количеству передач для обработки большого массива int.
Другие процессоры, такие как PPC, например, не могут обрабатывать только часть регистра, они всегда обрабатывают полный регистр. Тем не менее эти процессоры обычно имеют специальные операции загрузки, которые позволяют им, например. загрузить 16-битное значение из памяти, развернуть его до 32 бит и записать в регистр.Позже они имеют специальную операцию хранения, которая берет значение из регистра и сохраняет только последние 16 бит в памяти; для обеих операций требуется только один цикл ЦП, так же, как потребуется 32-разрядная загрузка/хранилище, поэтому также нет разницы в скорости. И поскольку PPC может выполнять только арифметические операции с регистрами (в отличие от x86, который также может работать непосредственно в памяти), эта процедура загрузки/хранения имеет место, независимо от того, используете ли вы 32-битные int или 16-битные int.
Единственным недостатком, если вы связываете несколько операций с 32-разрядным процессором, который может работать только с полными регистрами, является то, что 32-разрядный результат последней операции может быть «сокращен» до 16 бит до следующего операция выполняется, в противном случае результат может быть неправильным. Такой снимок - это всего лишь один цикл ЦП, хотя (простая операция И), и компиляторы очень хорошо разбираются, когда такой откат действительно необходим, и когда он его покидает, не окажет никакого влияния на конечный результат , поэтому такое сокращение не выполняется после каждой инструкции, оно выполняется только в том случае, если оно действительно неизбежно. Некоторые процессоры предлагают различные «расширенные» инструкции, которые делают такое сокращение ненужным, и я видел много кода в моей жизни, где я ожидал такого сокращения, но, глядя на сгенерированный код сборки, компилятор нашел способ полностью избегайте этого.
Итак, если вы ожидаете общего правила здесь, я должен вас разочаровать. Нельзя даже точно сказать, что 16-битные операции одинаково быстры для 32-разрядных операций, и никто не может точно сказать, что 32-разрядные операции всегда будут быстрее. Это зависит и от того, что именно делает ваш код с этими номерами и как он это делает. Я видел тесты, в которых 32-разрядные операции выполнялись быстрее на некоторых 32-битных ЦП, чем один и тот же код с 16-разрядными операциями, однако я также уже видел, что противоположное значение истинно. Даже переключение с одного компилятора на другой или обновление версии вашего компилятора может уже все снова развернуться. Я могу только сказать следующее: тот, кто утверждает, что работа с шортами значительно медленнее, чем работа с ints, должен предоставить примерный исходный код для этой заявки и назвать CPU и компилятор, который он использовал для тестирования, поскольку я никогда не испытывал ничего подобного внутри о последних 10 лет. Могут быть ситуации, когда работа с ints может быть на 1-5% быстрее, но все, что ниже 10%, не является «значительным», и вопрос в том, стоит ли в два раза потерять память в некоторых случаях только потому, что может купить вас 2% производительности? Я так не думаю.
Duplicate вопрос. См. [.NET Integer vs Int16?] (Http://stackoverflow.com/questions/129023/net-integer-vs-int16#137625) (Он помечен как .Net, но он применяется так же, как и об аппаратной архитектуре.) – 2008-10-02 16:18:31
@JonAdams: это абсолютно не дублируется, так как .NET является собственной структурой, и все, что справедливо для .NET, может быть недействительным ни для чего другого, кроме .NET. На некоторых процессорах 32 бит операционных может быть быстрее в .NET (так как .NET был оптимизирован для этого), но при написании простого кода C 64-разрядные операционные системы могут быть намного быстрее, чем 32-битные операционные системы на этом CPU (поскольку компилятор C может иметь возможность оптимизировать код намного лучше для 64 бит, чем для 32 бит). – Mecki 2012-08-24 16:53:23