У меня есть gnarly часть кода, чья эффективность во времени я бы хотел измерить. Поскольку оценить эту сложность из самого кода сложно, я хочу поместить его в цикл и время результатов. Когда собрано достаточное количество точек данных (размер → время), я вижу, какая кривая подходит лучше всего.
Повторяющиеся операции несколько раз со случайными входными данными заданного размера могут сглаживать колебания из-за того, что ОС решает многозадачность в ненадежные моменты, давая более точное время. Увеличение размера проблемы дает больше точек, идеально расположенных на расстоянии.
Мой тестовый код работает нормально (начальный, не синхронизированный цикл разогрева для уменьшения времени загрузки, а затем, начиная с размера 10, масштабирование до 1000000 с шагом в 10%, повторение прогонов пока не истечет 5 секунд или закончится 5 полных запусков). Тем не менее, я пришел к этим числам с помощью угадывания.
Есть ли принятый "научный" способ масштабирования повторений и размера проблемы для достижения более быстрых и более точных графиков времени-vs-размера? Есть ли там код (или библиотеки), который может создавать леса все скучные биты, и о которых я должен был знать раньше, чем кататься? В частности, я могу думать, что при обнаружении ударов по таймингу можно было бы оправдать большее количество мер - в то время как относительно гладкие показания можно было бы просто считать "достаточно хорошими".
Edit
Я знаю классический метод вычисления сложности большого О. Он отлично работает для автономных алгоритмов с хорошей репрезентативной операцией (скажем, "сравнения" или "свопы" ). Он не работает так, как рекламируется, когда эти условия не выполняются (например: затраты времени на создание экземпляра С++ для LLVM, который является большим и сложным, и где я не знаю, какова будет соответствующая репрезентативная операция). Вот почему я рассматриваю его как черный ящик и пытаюсь измерять время снаружи, а не проверять код.