точка байта и краткости в Java (я читал другие вопросы) - PullRequest
2 голосов
/ 14 апреля 2011

Мой вопрос: Если я правильно понял из разборки Java, когда я использую

byte a=3,b=5;
System.out.println(a+b);

будет фактически использовать int вместо байта. Также все слоты локальной памяти имеют размер 4B, как слоты стека. Я понимаю, что выделение байтового массива, вероятно, будет действовать более эффективно, но правда ли, что использование одного байтового значения в конечном итоге неэффективно? (Та же точка для краткости)

Ответы [ 5 ]

2 голосов
/ 14 апреля 2011

Важно понимать, что в Java существование byte и short не обязательно должно иметь целочисленный тип данных с меньшим диапазоном. Почти во всех случаях, когда хранятся (достаточно малые) числовые значения, будет использоваться int, даже если допустимый диапазон составляет всего 0-100.

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

Например, файловые системы в наши дни хранят потоки байтов. Вы можете использовать int для всех этих операций чтения / записи, но наличие типа данных byte упрощает операцию и делает это различие явным.

2 голосов
/ 14 апреля 2011

+ - целочисленная операция. вот почему

byte c = a+b; // compile error

вы должны использовать

int c = a + b 

или

byte c = (byte)(a+b);

Мой совет - используйте int, чтобы не произносить каждый раз. Если вы всегда имеете дело с byte, используйте байт, в противном случае используйте int

1 голос
/ 14 апреля 2011

Первое правило настройки производительности должно заключаться в написании простого и понятного кода.

В этом примере разницы в производительности нет, и даже если бы println () занимал в 10 000 раз больше, что делает разницуnotional.


Как программа отображается в байт-коде и как она выглядит в собственном коде, отличается.

Не все слоты в JVM являются 4-байтовыми.Например, ссылка на 64-битной машине может быть 8-байтовой, но она все еще использует один «слот»

На вашей машине нет слотов.Он имеет регистры, которые обычно являются 32-битными или 64-битными.

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

Примечание: объект с byteили short поля могут быть меньше, чем одно с полями int.

В этом примере JVM может вычислить c один раз, поэтому ей не нужно a или b

0 голосов
/ 14 апреля 2011

Определить неэффективно.

Да, объем памяти может показаться неэффективным, но имейте в виду, что большинство современных процессоров 32-битные (или даже 64-битные). Хранение байта всего в 8 битах потребует от процессора получения 32-битного адресного пространства, сдвига и очистки его так, чтобы необходимые 8 бит были в правильном месте.

0 голосов
/ 14 апреля 2011

Объявите byte a=3,b=5; как final byte a=3,b=5;, чтобы при выполнении этого оператора byte c = a+b; он принимал byte, а не int.

...