Так что я часто делаю что-то вроде следующего шаблона.Вместо:
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, это может помешать компилятору горячей точки или оптимизатору ина самом деле производите менее эффективный код?
Для потомков я не спрашиваю "как я могу улучшить скорость моей существующей программы".Я пытаюсь выяснить, «какой шаблон следует использовать при написании будущего кода».
Спасибо за любую информацию.