Что более эффективно для списков массивов: collections.swap() или использование временной переменной для обмена?

#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 реального мира на самом деле работают на нескольких платформах. И если здесь есть кто-то вроде этого, мы, вероятно, должны просто дать им спокойно отдохнуть, а не доставать их вопросами, подобными этому 🙂