Фон
Я бы хотел оценить большую производительность некоторых методов в библиотеке с помощью тестов. Мне не нужна точность - достаточно показать, что что-то есть O (1), O (logn), O (n), O (nlogn), O (n ^ 2) или хуже этого. Поскольку big-oh означает верхнюю границу, оценка O (logn) для чего-то, что является O (log logn), не является проблемой.
Прямо сейчас я собираюсь найти постоянный множитель k, который лучше всего подходит для данных для каждого большого-о (но будет превышать все результаты), а затем выбирая большой-ой с наилучшим подходом.
Вопросы
- Есть ли лучшие способы сделать это, чем то, что я люблю? Если да, то каковы они?
- В противном случае, может ли кто-нибудь указать мне на алгоритмы оценки k для наилучшего соответствия и сравнить, насколько хорошо каждая кривая соответствует данным?
Примечания и ограничения
Учитывая комментарии до сих пор, мне нужно сделать несколько понятных:
- Это должно быть автоматизировано. Я не могу "смотреть" на данные и вызывать суждение.
- Я собираюсь сравнить методы с несколькими размерами
n
. Для каждого размераn
я собираюсь использовать проверенную базовую платформу, которая обеспечивает надежные статистические результаты. - Я действительно заранее знаю, что большинство методов, которые будут проверены. Моя основная цель - предоставить им регрессионное тестирование производительности.
- Код будет записан в Scala, и любая свободная библиотека Java может быть использована.
Пример
Вот один из примеров того, что я хочу измерить. У меня есть метод с этой сигнатурой:
def apply(n: Int): A
Учитывая n
, он вернет n-й элемент последовательности. Этот метод может иметь O (1), O (logn) или O (n) с учетом существующих реализаций, а небольшие изменения могут заставить его использовать субоптимальную реализацию по ошибке. Или, что более легко, можно получить другой метод, который зависит от него, чтобы использовать его субоптимальную версию.