На 32-разрядных центральных процессорах действительно ли 'целочисленный' тип более эффективен, чем 'короткий' тип?

Вы должны позвонить hasNextInt() и passwordInput.nextInt() только один раз, чтобы получить пароль, например:

if (passwordInput.hasNextInt()) {
    if (passwordInput.nextInt() != builtInPassword) {
        System.out.println("You entered the right format \nbut the password is WRONG!");
    } else {
        System.out.println("Thanks,your password is correct");
    }
} else {
    System.out.println("WRONG format!");
}
9
задан Jordan Parmer 2 October 2008 в 16:14
поделиться

7 ответов

Да, необходимо определенно использовать целое число на 32 бита на ЦП на 32 бита, иначе это может закончить тем, что маскировало от неиспользованных битов (т.е. это будет всегда делать математику в 32 битах, затем преобразовывать ответ на 16 битов),

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

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

Если они используются для промежуточных вычислений во внутреннем цикле где-нибудь, то используйте 32-разрядный. Однако, при чтении этого из диска, или даже если просто необходимо заплатить за неудачное обращение в кэш, он может все еще удаться лучше для использования 16-разрядных целых чисел. Как со всей оптимизацией, существует только один способ знать: представьте его.

13
ответ дан 4 December 2019 в 06:07
поделиться

Это зависит. Если Вы будете зависящими от ЦП, то 32 битовых операции на ЦП на 32 бита будут быстрее, чем 16 битов. Если Вы - связанная память (конкретно, если у Вас есть слишком много неудачных обращений в кэш L2), то используйте самые маленькие данные, в которые можно сжать.

Можно узнать, какой Вы используете профилировщика, который измерит и ЦП и L2 промахи как VTune Intel. Вы выполните свои времена приложения 2 с той же загрузкой, и она объединится, эти 2 сталкивается с одним представлением горячих точек в Вашем приложении, и Вы видите для каждой строки кода, сколько циклов было потрачено на ту строку. Если в дорогой строке кода, Вы видите 0 неудачных обращений в кэш, Вы являетесь зависящими от ЦП. Если Вы видите тонны промахов, Вы - связанная память.

3
ответ дан 4 December 2019 в 06:07
поделиться

При использовании "многих" целочисленные значения узкое место в обработке склонно быть пропускной способностью к памяти. Целочисленный пакет на 16 битов более плотно в кэш данных, и поэтому был бы победой производительности.

Если Вы - перемалывание чисел на очень большом объеме данных, необходимо считать то, Что Каждый Программист Должен Знать О Памяти Ulrich Drepper. Концентрат на главе 6, о максимизации эффективности кэша данных.

8
ответ дан 4 December 2019 в 06:07
поделиться

Если у Вас есть большой массив чисел, то пойдите с самым маленьким размером, который работает. Будет более эффективно работать с массивом коротких замыканий на 16 битов, чем 32 бита ints, так как Вы получаете дважды плотность кэша. Стоимость любого расширения знака, которое ЦП должен сделать для работы с 16 битовыми значениями в регистрах на 32 бита, тривиально незначительна по сравнению со стоимостью неудачного обращения в кэш.

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

14
ответ дан 4 December 2019 в 06:07
поделиться

Если Вы воздействуете на большой набор данных, самое большое беспокойство является объемом потребляемой памяти. Хорошая модель в этом случае должна предположить, что ЦП бесконечно быстр, и проведите свое время, волнуясь о том, в какое количество должны быть перемещены данные. На самом деле центральные процессоры теперь так быстры, что иногда более эффективно закодировать (например, сжатие) данные. Тем путем ЦП делает (потенциально очень) больше работы (декодирование/кодирование), но пропускная способность памяти существенно уменьшается.

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

1
ответ дан 4 December 2019 в 06:07
поделиться

Не слушайте совета, попробуйте.

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

3
ответ дан 4 December 2019 в 06:07
поделиться

Когда вы говорите «32 бит», я предполагаю, что вы имеете в виду x86. 16-битная арифметика довольно медленная: префикс размера операнда делает декодирование действительно медленным. Так что не сокращайте временные переменные int или int16_t.

Однако x86 может эффективно загружать 16- и 8-битные целые числа в 32- или 64-битные регистры. (movzx / movsx: расширение нуля и знака). Поэтому не стесняйтесь использовать short int для массивов и полей структуры, но убедитесь, что вы используете int или long для своих временных переменных.

Однако, если я складываю два коротких целых числа, будет ли ЦП упаковывать оба значения за один проход параллельно (таким образом, охватывая 4-байтовую полосу пропускания шины)?

Это ерунда. инструкции загрузки / сохранения взаимодействуют с кешем L1, и ограничивающим фактором является количество операций; ширина не имеет значения. например, на core2: 1 загрузка и 1 накопление за цикл, независимо от ширины. Кэш L1 имеет 128- или 256-битный путь к кэш-памяти L2.

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

0
ответ дан 4 December 2019 в 06:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: