Да, я использую это. И нет, это не часто «обсуждается», так же как мы не часто обсуждаем, является ли «orderCount» или «xyz» лучшим именем переменной.
Обычно, вы не садитесь и не анализируете это, но вы развиваете интуитивное чувство, основанное на том, что вы знаете, и в большинстве случаев в значительной степени можете оценить сложность O
на лету .
Обычно я думаю, что мне нужно выполнить много операций со списком. Я делаю какие-то ненужные вещи O(n^2)
сложности, которые могли бы быть сделаны за линейное время? Сколько проходов я делаю по списку? Это не то, что вам нужно для формального анализа, но без знания нотации big-O сделать это намного сложнее.
Если вы хотите, чтобы ваше программное обеспечение работало приемлемо при больших размерах входных данных, то вам необходимо учитывать сложность ваших алгоритмов в больших объемах, формально или неформально. Профилирование отлично подходит для того, чтобы рассказать вам, как программа выполняет сейчас , но если вы используете алгоритм O(2^n)
, ваш профилировщик скажет вам, что все в порядке, пока ваш входной размер крошечный. А затем ваш входной размер увеличивается, а время выполнения взрывается.
Люди часто отвергают нотацию big-O как «теоретическую», «бесполезную» или «менее важную, чем профилирование». Что просто указывает на то, что они не понимают, что такое сложность big-O для . Это решает другую проблему, чем профилировщик. Оба необходимы при написании программного обеспечения с хорошей производительностью. Но в конечном итоге профилирование - это реактивный инструмент. Он говорит вам, где ваша проблема, как только проблема существует .
Сложность Big-O проактивно говорит вам, какие части вашего кода взорвутся, если вы запустите его на больших входах. Профилировщик не может вам этого сказать.