в чем разница между временем выполнения, сложностью, временем компиляции и временем выполнения?

50
1

в чем разница между временем выполнения, сложностью, временем компиляции и временем выполнения? У меня есть конфликт между временем выполнения и временной сложностью, и какова разница между ними и временем выполнения?

спросил(а) 2016-08-12T23:43:00+03:00 3 года, 8 месяцев назад
1
Решение
64

То, что вы действительно задаете, - это преобразование сложности Big O Time во время выполнения. Это не так просто, как кажется на первый взгляд.

Поэтому сначала рассмотрите сложности в первую очередь. Чтобы сделать его проще, используйте этот простой пример C++:

int fact(int n)
{
if (n<=1) return 1;
return n*fact(n-1);
}

Сложность времени и пространства

(Для начала я предполагаю, что основные переменные, следовательно, все сложности такие же, как основание для получения дополнительной информации смотрите следующий пункт) Так что вся эта вещь будет делать n итераций подразумевая O(n) время сложности. Поскольку это использует рекурсию и кучу стека для одного вспомогательного результата, сложность времени также O(n).

Базовая сложность против истинной сложности

Базовая сложность Используется сложность алгоритма. Но при внедрении в программу сложность может измениться (к худшему) из-за таких вещей, как переменные реализации, протоколы ввода-вывода и т.д.

Например, что, если мы будем использовать bigint вместо int?. Программа такая же, поэтому базовая сложность остается O(n). Проблема с bigints заключается в том, что не сложность O(1) пространства (более похожая на O(log(n))), а операции с ними также не являются O(1). Например, если (m=log(n)), то операции (+,-,&,|,^) равны O(m), взаимно колеблющиеся могут варьироваться до O(m^2). Поэтому при объединении сложности времени будет O(n.log(n).log(n)) если используется O(m^2) умножение. Сложность пространства также хуже O(n.log(n)).

Проблема в том, что большинство новичков используют только базовую сложность алгоритма, а не всю сложность реализации, приводящую к неясным результатам. Другой проблемой в настоящее время является злоупотребление библиотеками и фреймворками без каких-либо знаний о том, что стоит за ними.

Время выполнения вычислений

Этот термин при программировании иногда считается оксюмороном. Нет надежного метода преобразования сложностей во время выполнения для произвольных реализаций. Зачем? Поскольку время выполнения зависит от слишком многих вещей, таких как:

Стенд Space & Time сложности

Современные архитектуры используют конвейерную обработку, сверхсказу, CACHES и т.д. Поэтому, когда вы нажимаете на барьеры, производительность может меняться во много раз чаще, чем обычно.

Платформа HW

Каждая платформа отличается. Конфигурация размеров трубопроводов/кеш-памяти, стратегий управления, латентности и т.д. Имеют огромное значение даже при сравнении между аналогичными процессорами мощности. На платформе HW это намного больше, чем просто процессор. И каждый используемый модуль подсчитывает (память, HDD, DMA, gfx...)

составитель

Каждый компилятор имеет свои собственные причуды, оптимизацию и многое другое, что приводит к разным результатам сборки. Это может привести к огромным различиям между исполняемыми файлами одного и того же исходного кода, скомпилированными на разных компиляторах.

Операционные системы

ОС запускает больше, чем просто ваше приложение. Существуют службы, прерывания, задачи обслуживания, другие процессы, которые влияют на время выполнения.

стиль программирования

Это тоже может сделать. Большинство различий в стиле программирования обычно противопоставляются оптимизациями компилятора, но не все. Например, рекурсия до выбора итерации может сделать огромное (обычно отрицательное) влияние на время выполнения.

Оптимизации

Если вы посмотрите на неоптимизированный код и оптимизированный код в сборке, вы часто не будете распознавать код. Это не должно влиять на базовую сложность программы, но часто меняет истинную сложность, если может.

Кроме того, я кодирую в течение десятилетий, поэтому я привык оптимизировать свой код сам. Это предпочтение иногда вводит в заблуждение современных компиляторов и приводит к замедлению получаемого кода в редких случаях.

Итак, как вычислить время выполнения?

Вы просто не можете, чтобы все, что вы можете сделать, это измерение + оценка.

измерять время при запуске задачи t0

измерять время во время задачи (время от времени)

например, каждый второй или каждый 1000th итерации... запоминание времени t и iteartion i. Это иногда называют прошедшим временем.

предсказать оставшееся время.

Итак, если у нас есть временная сложность O(n) то (если я не ошибаюсь):

t(0) = t0
t(i) = ti ~= t0 + T*i -> T ~= (ti-t0)/i
t(n) = t0+T*n ~= t0 + (ti-t0)*n/i

Вы можете усреднить или обновить это время во время вычисления, чтобы оно было более точным с каждым новым измерением. Также иногда лучше оценивать время выполнения из последних нескольких измерений t(i) и t(j) поскольку возможности обработки могут меняться в течение времени.

Остерегайтесь степени детализации ОС при измерении времени с высокой точностью

Если не принимать во внимание, это может ввести в заблуждение ваши вычисления. Но это имеет значение только в том случае, если вы хотите измерить очень быстрые процессы, которых я не думаю.

PS.

Все это работает только для достаточно больших n иначе отброшенные термины от сложностей все еще имеют значение и негативно влияют на точность результата.

Время компиляции

Как уже упоминалось в других ответах, это время, когда компилятор должен обработать ваш исходный код. Это не имеет никакого отношения к сложности программы. В основном это зависит от уровня рекурсии, длины исходного кода, использования макросов и рекурсии, использования шаблонов и т.д.

Часто путем простого изменения порядка #include и избежания множественных включений вы можете значительно улучшить время компиляции. Хорошим примером является структура AVR32 от Atmel... После настройки этого времени компиляция может быть улучшена в 100 раз и более. Однажды я увидел (10+ лет назад) прошивку принтера, которая имеет 300 МБ исходного кода (в то время), и из-за злоупотребления включением время компиляции было немного меньше, чем час..., который был сумасшедшим, учитывая, что это был код для один MCU...

Надеюсь, это поможет немного

ответил(а) 2016-08-13T11:18:00+03:00 3 года, 8 месяцев назад
51

Время выполнения - это время, которое ваша программа выполняет для выполнения. Например, 10 секунд или 10 миллисекунд.

Сложность обычно относится к асимптотическому поведению вашего алгоритма. Говоря проще, он показывает, насколько эффективен ваш алгоритм. В этом отношении мы обычно используем сложность времени и пространственную сложность. Сложность времени показывает асимптотически, насколько быстро ваш алгоритм может работать, а Space Complexity показывает, сколько бит памяти будет использовать ваш алгоритм. Здесь используются обозначения, такие как большой O, маленький o, Theta и т.д. (см. TimeComplexity)

Время выполнения может использоваться взаимозаменяемо с временем выполнения (сколько времени требуется для завершения вашей программы). Однако, как правило, когда возникает некоторая ошибка при запуске программы, они обычно ссылаются на нее также на ошибку времени выполнения.


Кроме того, время компиляции - это время, которое требуется для компиляции программы и ее преобразования в исполняемый файл.

См. Также RunTime, ExecutionTime и CompileTime.

ответил(а) 2016-08-13T00:55:00+03:00 3 года, 8 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема