Это на самом деле глубокая проблема, которая имеет некоторые методические и некоторые прагматические ответы. Я предполагаю, что вы хотите знать кое-что об алгоритме (-ах) под рукой. Если вы хотите знать, какой алгоритм лучше работает на данном компьютере с заданными входами, продолжайте и измерьте время выполнения. Если вы хотите сравнить качество компилятора для данного алгоритма, продолжайте измерять время выполнения. Чтобы узнать что-то об алгоритме, не делайте этого.
Позвольте мне сначала привести несколько причин, по которым использование среды выполнения не очень хорошая идея.
- всеобщность
Runtimes измеряется с помощью одного языка и один компилятор на одной машине , имеют мало смысла , если вы изменить какой - либо компонент. Даже немного отличающиеся реализации одного и того же алгоритма могут работать по-разному, потому что вы запускаете некоторую оптимизацию компилятора в одном случае, но не в другом.
- прогнозирование
Итак, у вас есть пара времени выполнения для некоторых входных данных. Что это говорит о времени выполнения какого-либо другого ввода? В общем ничего.
- Значение
Обычно вы не будете сравнивать все входные данные (некоторого размера), так что это сразу же ограничивает вашу способность сравнивать алгоритмы: может быть, ваш тестовый набор вызвал наихудший случай в одном и лучший случай в другом алгоритме? Или, возможно, ваши входные данные были слишком малы, чтобы продемонстрировать поведение во время выполнения .
- Замер
Измерительные автономной работы хорошо не тривиально. Есть ли JIT? Был ли спор, то есть вы считаете время, когда алгоритм даже не запускался? Можете ли вы воспроизвести точно такое же состояние машины для другого прогона (другого алгоритма), в частности параллельных процессов и кэшей? Как бороться с задержкой памяти?
Я надеюсь, что это убедило вас, что время выполнения - ужасная мера для сравнения алгоритмов, и что нужен какой-то общий, абстрактный метод исследования времени выполнения алгоритма.
На второй части вопроса. Почему мы используем сравнения или подобные элементарные операции?
Аналитическая управляемость
Предполагая, что вы хотите сделать формальный анализ, вы должны быть в состоянии сделать это. Подсчет отдельных утверждений очень технический, иногда даже сложный; тем не менее, некоторые люди делают это (например, Кнут). Подсчет только некоторых операторов - тех, которые доминируют во время выполнения - проще. По той же причине мы часто "только" исследуем (верхние границы) время выполнения в худшем случае.
Доминирование Выбранная
операция доминирует во время выполнения. Это не означает, что он вносит большую часть времени выполнения - сравнения явно нет, например, в быстрой сортировке при сортировке целочисленных по размеру слов. Но они выполняются чаще всего , поэтому, подсчитав их, вы посчитаете, как часто выполняются самые исполняемые части алгоритма. Следовательно, ваша асимптотическая среда выполнения пропорциональна числу доминирующих элементарных операций. Вот почему нам удобно использовать нотацию Ландау и слово «время выполнения», хотя мы учитываем только сравнения.
Обратите внимание, что может быть полезно сосчитать более одной операции. Например, некоторые варианты быстрой сортировки требуют больше сравнений, но меньше свопов, чем другие (в среднем).
Что бы это ни стоило, после того, как вы сделали всю теорию, вы, возможно, захотите пересмотреть время выполнения, чтобы убедиться, что предсказания, которые делает ваша теория, являются правильными. Если это не так, ваша теория бесполезна (на практике) и должна быть расширена. Иерархия памяти - это одна из первых вещей, которые, как вы понимаете, важны, но отсутствуют в базовом анализе.