#java #arraylist #collections #time-complexity #swap
#java #arraylist #Коллекции #временная сложность #обмен
Вопрос:
int temp = name.get(0);
name.set(0, name.get(1));
name.set(1, temp)
Collections.swap(name, 0, 1)
Я хочу поменять местами два элемента и не знаю, какой из них более эффективен. Похоже, что время выполнения обоих обменов одинаково, но я не слишком уверен. Спасибо!
Комментарии:
1.
name.set(0, name.set(1, name.get(0)));
что делает swap. По-прежнему используется временное местоположение в стеке. Так что никакой реальной разницы, поскольку JIT будет встроеннымswap
.
Ответ №1:
Collections.swap
является:
public static void swap(List<?> list, int i, int j) {
// instead of using a raw type here, it's possible to capture
// the wildcard but it will require a call to a supplementary
// private method
final List l = list;
l.set(i, l.set(j, l.get(i)));
}
Итак, 2 get
с и 2 set
с против 1 get
и 2 set
с. Также Collections.swap
красиво использует возвращаемые значения из set
, чтобы обойти использование переменной temp.
Ответ №2:
Я хочу поменять местами два элемента и не знаю, какой из них более эффективен. Похоже, что время выполнения обоих обменов одинаково, но я не слишком уверен.
Единственный способ убедиться в этом — написать надлежащий микро-бенчмарк, запустить его (на нескольких аппаратных платформах / версиях Java) и интерпретировать результаты.
Мы можем посмотреть на исходный код и сделать некоторые обоснованные предположения, но мы не можем вывести эффективность на микроуровне из первых принципов1.
Мой совет:
- Напишите код так, как вы считаете наиболее удобочитаемым, и позвольте компиляторам выполнить оптимизацию. Обычно они могут выполнять работу лучше, чем большинство программистов.
- Если производительность вашего приложения вызывает беспокойство, напишите тест приложения и используйте профилировщик, чтобы выяснить, где находятся «горячие точки» реальной производительности.
- Используйте информацию о точках доступа, чтобы решить, где стоит приложить усилия для ручной настройки приложения… не ваша интуиция / догадки.
1 — … если только здесь нет кого-то с нездорово подробным объемом знаний о том, как компиляторы Java JIT реального мира на самом деле работают на нескольких платформах. И если здесь есть кто-то вроде этого, мы, вероятно, должны просто дать им спокойно отдохнуть, а не доставать их вопросами, подобными этому 🙂