Разработчики должны понимать производительность последствия из их варианты кодирования.
Не очень сложно написать алгоритм, который приводит к нелинейной производительности - полиномиальный, экспоненциальный или хуже. Если вы в какой-то степени не понимаете, как язык, компилятор и библиотеки поддерживают ваш алгоритм, вы можете оказаться в ловушке, из-за которой никакая вычислительная мощность не вырвет вас. Алгоритмы, чье время выполнения или использование памяти экспоненциально, могут быстро превысить способность любого оборудования выполнять в разумные сроки.
Предполагать, что аппаратное обеспечение может масштабироваться до плохо спроектированного выбора алгоритма / кодирования, - плохая идея. Возьмем, например, цикл, который объединяет 100 000 небольших строк (например, в сообщение XML). Это не редкая ситуация - но при реализации с использованием конкатенации отдельных строк (а не StringBuffer) это приведет к 99 999 промежуточным строкам увеличивающегося размера, которые должен утилизировать сборщик мусора. Это может легко привести к сбою операции, если не хватает памяти - или, в лучшем случае, для запуска потребуется вечность.
Теперь в приведенном выше примере некоторые компиляторы Java обычно (но не всегда) переписывают код для использования StringBuffer за кулисами - но это исключение, а не правило . Во многих ситуациях компилятор просто не может определить намерения разработчика - и ответственность за написание эффективного кода ложится на разработчика .
Последний комментарий: написание эффективного кода не означает тратить все свое время на поиск микрооптимизаций. Преждевременная оптимизация - враг написания хорошего кода . Однако не следует путать преждевременную оптимизацию с пониманием производительности алгоритма в O () с точки зрения времени / памяти и правильным выбором того, какой алгоритм или дизайн использовать в какой ситуации.
Как разработчик, вы не можете игнорировать этот уровень знаний и просто предполагать, что вы всегда можете использовать больше оборудования.