Является ли оператор for в цикле быстрее, чем один оператор if в Java? - PullRequest
0 голосов
/ 30 мая 2019

Интересно, что если я использую HashMap для сбора условий и зацикливаю каждое в одном операторе if, я могу достичь более высокой производительности, чем писать одно за другим оператор if - else if?

По моему мнению, операторы if-else, if-else, один за другим, могут быть быстрее, потому что в цикле for выполняется еще одно условие в каждом цикле, например, достигает ли счетчик целевого числа? Таким образом, фактически каждый оператор if выполняет 2 оператора if. Конечно, внутри утверждений все по-другому, но если говорить только о производительности операторов, я думаю, что один за другим будет лучше?

Изменить: это просто пример кода, мой вопрос о разнице в производительности между использованием этих операторов.

Map<String, Integer> words = new HashMap<String, Integer>
String letter ="d";
int n = 4;
words.put("a",1);
words.put("b",2);
words.put("c",3);
words.put("d",4);
words.put("e",5);

words.forEach((word,number)->{
if(letter.equals(word){
System.out.println(number*n);
});

String letter ="d";
int n = 4;
if(letter.equals("a"){
System.out.println(number*1);
}else if(letter.equals("b"){
System.out.println(number*2);
}else if(letter.equals("c"){
System.out.println(number*3);
}else if(letter.equals("d"){
System.out.println(number*4);
}else if(letter.equals("e"){
System.out.println(number*5);
}

Ответы [ 2 ]

2 голосов
/ 30 мая 2019

Для вашего примера, иметь HashMap, но затем выполнять итеративный поиск, кажется плохой идеей.Смысл использования HashMap в том, чтобы иметь возможность выполнять поиск на основе хеша.Это намного быстрее, чем выполнение итеративного поиска.

Кроме того, из вашего примера каскадные тесты if-then будут определенно быстрее, поскольку они позволят избежать накладных расходов итератора карты и дополнительных вызовов функций.Кроме того, они будут избегать накладных расходов итератора карты, пропуская пустые места хранения в массиве поддержки хэш-карты.Лучший вопрос заключается в том, быстрее ли каскадные if-thens, чем итерации по простому списку.Это трудно ответить.Каскадное if-thens кажется более быстрым, за исключением того, что если есть много if-thens, то следует добавить стоимость загрузки кода.

Для поиска строк структура данных списка обеспечивает адекватное поведениедо предельного значения, выше которого должна использоваться более сложная структура данных.Какое предельное значение зависит от окружающей среды.Для сравнения строк я обнаружил переход между 20 и 100 элементами.

Для определенных поисков и при наличии оптимизации низкого уровня значение перехода может быть намного больше.Например, при целочисленном поиске с использованием «C», который может выполнять прямой поиск в памяти, значение перехода намного выше.

Типичными структурами данных являются HashMaps, Tries и отсортированные массивы.Каждый соответствует определенным схемам доступа.Например, отсортированные массивы являются самыми быстрыми и компактными, но их обновление дорого.HashMaps поддерживают динамические обновления, а для хороших хеш-функций обеспечивают постоянный поиск по времени.Но HashMaps неэффективны в пространстве, так как они зависят от наличия пустых ячеек между значениями хеш-функции.

Для случаев, которые не включают «очень большие» наборы данных и которые не находятся в критических «горячих» путях кода, HashMapsобычная структура, которая используется.

1 голос
/ 30 мая 2019

Если у вас есть Карта и вы хотите получить одно письмо, я не уверен, зачем вам вообще делать цикл?

Map<String, Integer> words = new HashMap<String, Integer>
String letter ="d";
int n = 4;
words.put("a",1);
words.put("b",2);
words.put("c",3);
words.put("d",4);
words.put("e",5);

if (words.containsKey(letter) {
  System.out.println(words.get(letter)*n);
}
else
{
  System.out.println(letter + " doesn't exist in Map");
}

Если вы не используете преимущества Карты, зачем вообще использовать Карту?

ForEach будет фактически касаться каждой клавиши в списке. Количество проверок вашего if / else зависит от того, где оно находится в списке и какова длина списка доступных букв. Если выбранное вами письмо является последним в списке, оно завершит все проверки перед печатью. Если он первый, то он сделает только тот, который намного быстрее, чем проверка всех.

Вам будет легко написать два примера и запустить таймер, чтобы определить, какой из них на самом деле быстрее. https://www.baeldung.com/java-measure-elapsed-time

Существует множество бесполезных вычислений, если вам нужно выполнить 1 миллион операторов if / else и выбрать только один из них, который может быть где угодно в списке. Это не включает опечатки и ужас обслуживания кода. Использование карты с индексом будет намного быстрее. Если вы говорите только о 100 операторах if / else (на мой взгляд, их все же слишком много), то вы, возможно, сможете добиться безубыточности по скорости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...