Это интересный вопрос. Я не думаю, что кто-нибудь знает ответ. Я считаю, что значительная часть проблемы заключается в том, что для более сложных программ никто не может предсказать их сложность. Поэтому, даже если у вас есть результаты профилировщика, очень сложно интерпретировать их с точки зрения изменений, которые необходимо внести в программу, поскольку у вас нет теоретической основы для определения оптимального решения.
Я думаю, что это причина, почему у нас так раздутые программы. Мы оптимизируем только для того, чтобы на наших быстрых машинах работали довольно простые случаи. Но как только вы соберете такие кусочки в большую систему или используете больший входной сигнал, используемые неправильные алгоритмы (которые до этого были невидимы как теоретически, так и практически) начнут показывать их истинную сложность.
Пример: вы создаете строковый класс, который обрабатывает Unicode. Вы используете его где-то, как компьютерная обработка XML, где это действительно не имеет значения. Но обработка Unicode там, принимая участие ресурсов. Сам по себе строковый класс может быть очень быстрым, но вызывать его миллион раз, и программа будет работать медленно.
Я полагаю, что большинство современных программных приложений имеют такую же природу. Есть способ уменьшить его, но это противоречит ООП. Есть интересная книга Есть интересная книга о различных техниках, она ориентирована на память, но большинство из них можно повернуть вспять, чтобы получить большую скорость.