Поэтому я часто нахожу, что делаю что-то вроде следующего шаблона. Вместо:
if (map.containsKey(someKey)) {
Value someValue = map.get(someKey);
...
}
Чтобы не пересекать карту дважды (и поскольку я знаю, что моя карта не хранит нули), я сделаю:
Value someValue = map.get(someKey);
if (someValue != null) {
...
}
Мне кажется, что это хороший шаблон, учитывая, что операции Map
выполняют приличное количество операций, и оптимизатор, я полагаю, недостаточно умен, чтобы оптимизировать его.
Но тогда я обнаруживаю, что делаю подобные шаблоны в других ситуациях. Например, должен ли я хранить результат someMethod()
во временной переменной вместо того, чтобы делать вызов дважды? Ясно, что я не могу назвать someMethod()
дважды, если есть побочные эффекты, но когда имеет смысл только называть его один раз с точки зрения оптимизации?
if (someObject.someMethod() != null) {
processSomehow(someObject.someMethod());
}
Я знаю, что это граничит с "неконструктивным" вопросом, поэтому я ищу ответы, в которых представлены некоторые факты и ссылки, а не просто гипотеза.
- Когда имеет смысл делать это, а когда нет?
- Как мне оценить "стоимость"
someMethod()
, чтобы определить, когда должна использоваться временная переменная? - Для простых методов, таких как методы get, возможно, это мешает компилятору или оптимизатору hotspot и фактически создает менее эффективный код?
Для потомков я не спрашиваю, "как я могу улучшить скорость моей существующей программы". Я пытаюсь выяснить, "какой шаблон я должен использовать при написании будущего кода".
Спасибо за любую информацию.