Является ли использование байта в итерации l oop более эффективным? - PullRequest
0 голосов
/ 16 апреля 2020

При объявлении байта в Java вам требуется меньше места в памяти, чем при объявлении целого числа. Итак, является ли более эффективным (например, с использованием меньшего количества памяти) итерация, например, массива с использованием байта, когда, например, длина массива <128? </p>

И если это более эффективно, есть ли примеры, когда Я действительно признал бы улучшения как пользователь?

for(byte b = 0; b < array.length; b++) {}

вместо

for(int i = 0; i < array.length; i++) {}

Ответы [ 2 ]

3 голосов
/ 16 апреля 2020

Нет. Напишите самый понятный и интуитивно понятный код, какой только сможете. В наиболее распространенных случаях JVM будет работать лучше всего.

Если вас беспокоит написание эффективного кода, посмотрите на свои алгоритмы и прочитайте книги по эффективному java.

1 голос
/ 16 апреля 2020

Хорошо, давайте посмотрим, что генерирует компилятор.

Исходный код

short[] array = new short[0];

for(int i = 0; i < array.length; i++) {}
for(byte b = 0; b < array.length; b++) {}

Байт-код

 0: iconst_0                      array = new short[0];
 1: newarray       short
 3: astore_1
-------------------------------------------------------
 4: iconst_0                      i = 0
 5: istore_2

 6: goto          12

 9: iinc          2, 1            i++

12: iload_2                       i < array.length
13: aload_1
14: arraylength
15: if_icmplt     9
-------------------------------------------------------
18: iconst_0                      b = 0
19: istore_2

20: goto          28

23: iload_2                       b++
24: iconst_1
25: iadd
26: i2b
27: istore_2

28: iload_2                       b < array.length
29: aload_1
30: arraylength
31: if_icmplt     23
-------------------------------------------------------
34: return

i = 0 и b = 0 генерируют точно такой же код.

i < array.length и b < array.length генерируют точно такой же код.

Однако код для i++ и b++ совсем другое. 1-байтная инструкция для int, 5-байтная инструкция для byte.

Что JIT делает с этим, неизвестно, но, если что-нибудь, использование byte в качестве переменной итератора массива делает код медленнее.

Хотя, как уже говорили другие, вы, скорее всего, не сможете заметить разницу, особенно относительно того, что происходит внутри l oop (который на самом деле не будет пустым).

Напишите код, который имеет смысл для кода logi c.

...