Я провел несколько тестов во время выполнения с помощью java для циклов и распознал странное поведение. Для моего кода мне нужны объекты-обертки для примитивных типов, таких как int, double и т. Д., Для имитации параметров io и вывода, но это не так. Просто посмотри мой код. Как объекты с доступом к полям быстрее, чем примитивные типы?Оптимизация Java for-loop
for
петля с prtimitive типа:
public static void main(String[] args) {
double max = 1000;
for (int j = 1; j < 8; j++) {
double i;
max = max * 10;
long start = System.nanoTime();
for (i = 0; i < max; i++) {
}
long end = System.nanoTime();
long microseconds = (end - start)/1000;
System.out.println("MicroTime primitive(max: ="+max + "): " + microseconds);
}
}
Результат:
микропоры примитива (макс: = 10000,0): 110
микропоры примитива (макс: = 100000,0): 1081
микропоры (max: = 1000000,0): 2450
MicroTime-примитив (макс .: = 1.0E7): 28248
MicroTi мне примитивный (макс: = 1.0E8): 276205
микропоры примитив (макс: = 1.0E9): 2729824
микропоры примитив (макс: = 1.0E10): 27547009
for
цикл с простым типом (обертка объект):
public static void main(String[] args) {
HDouble max = new HDouble();
max.value = 1000;
for (int j = 1; j < 8; j++) {
HDouble i = new HDouble();
max.value = max.value*10;
long start = System.nanoTime();
for (i.value = 0; i.value <max.value; i.value++) {
}
long end = System.nanoTime();
long microseconds = (end - start)/1000;
System.out.println("MicroTime wrapper(max: ="+max.value + "): " + microseconds);
}
}
Результат:
микропоры обертка (макс: = 10000,0): 157
микропоры Обертка (макс: = 100000,0): 1561
микропоры обертка (макс: = 1000000,0): 3174
микропоры обертка (макс: = 1.0E7): 15630
микропоры обертка (макс: = 1.0E8): 155471
микропоры обертка (макс: = 1.0E9): 1520967
микропоры обертка (макс: = 1.0E10): 15373311
Чем больше итераций, тем быстрее второго кода. Но почему? Я знаю, что java-компилятор и jvm оптимизируют мой код, но я никогда не думал, что примитивные типы могут быть медленнее, чем объекты с доступом к полям.
У кого-нибудь есть правдоподобное объяснение?
Отредактировано: HDouble класс:
public class HDouble {
public double value;
public HDouble() {
}
public HDouble(double value) {
this.value = value;
}
@Override
public String toString() {
return String.valueOf(value);
}
}
Я также протестировал мою петлю с кодом в нем. Например, я вычисляю сумму -> такое же поведение (разница не такая большая, но я думал, что примитивный алгоритм должен быть намного быстрее?). Сначала я подумал, что расчет длится так долго, что в поле практически нет разницы.
Обертка для цикла:
for (i.value = 0; i.value <max.value; i.value++) {
sum.value = sum.value + i.value;
}
Результат:
микропоры обертку (макс: = 10000.0): 243
микропоры обертка (макс: = 100000.0): 2805
микропоры обертки (max: = 1000000.0): 3409
микропоры обертка (макс: = 1.0E7): 28104
микропоры обертка (макс: = 1.0E8): 278432
микропоры обертка (макс: = 1.0E9): 2678322
микропоры обертка (макс: = 1.0E10): 26665540
Примитив для цикла:
for (i = 0; i < max; i++) {
sum = sum + i;
}
Результат:
микропоры примитива (макс: = 10000,0): 149
микропоры примитива (макс: = 100000,0): 1996
микропоры примитива (макс: = 1000000,0): 2289
микропоры примитива (макс: = 1.0E7): 27085
микропоры примитив (макс: = 1.0E8): 279939
микропоры примитив (макс: = 1.0E9): 2759133
микропоры примитив (макс: = 1.0E10): 27369724
Я предлагаю положить какой-то живой код внутри цикла. Пустые петли редки в реальных программах или даже в серьезных тестах, поэтому оптимизация для них может быть не очень последовательной или хорошо протестированной. –
Можете ли вы показать код «HDouble»? – manouti
Я отредактировал мое сообщение и добавил код Hdouble;) – user3490546