2013-03-30 3 views
-2

Можно создать программу, которая, скажем, с байтовым кодом, запускает вашу программу как обычно, сохраняя подсчет общего времени выполнения, используя определенные промежутки времени каждой команды, так как вы идти? Затем, как только ваша программа закончится, у вас будет точное, независимое от системы значение для времени выполнения, без необходимости многократно запускать вашу программу и усреднять результаты или находить мин. Разумеется, связь между этим и фактическим временем выполнения отличается в зависимости от избыточного количества переменных, но все же кажется, что такая цифра была бы хорошей, по крайней мере, иметь возможность использовать.Вычисление точного времени выполнения, а не фактического времени выполнения

Итак, для ясности, есть три вопроса здесь (извините, но это только предотвращает последующие вопросы для лаконичности), опираясь друг на друга:

  1. Является ли это возможно, или есть теоретический результат, предотвращает это (проблема с остановкой или что-то еще)?

  2. Если это возможно, почему это никогда не используется? Это кажется ценным по многим практическим причинам.

  3. Или есть один, который существует, и я просто пропустил его?

+2

http://stackoverflow.com/questions/how-to-ask Этот вопрос слишком открытый. – OldProgrammer

+1

Что вы предлагаете, вероятно, непрактично. Количество переменных, которые влияют на время выполнения фрагмента кода на современных системах, - это легион. Даже температура и влажность воздуха могут влиять на время выполнения. – Taylor

+0

Ваш лучший выбор - это, вероятно, виртуальная машина с счетчиком. Это ... необычный уровень оптимизации. Часто вы можете теоретизировать о коде на этом уровне. – Dave

ответ

0

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

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

  • Остановка теорема говорит, что вы не можете определить, априори собирается ли какая-либо программа, чтобы остановить с данным входным набором.

  • На практике технология доказательства доказательств не соответствует задаче ни для чего, кроме действительно простых программ.

  • Попытка получить модель эмпирическим путем (т.е. подстраиваться кривую к экспериментальным результатам) не будет работать, потому что:

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

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

O(exp(((64b/9)^(1/2).(log b)^(2/3))) 

где b это количество битов в количестве. Это невозможно для больших значений b.

Итак ...

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

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

+0

Правда, единственный временной тайм-код действительно ценен, когда вы тестируете его на множестве случайных входных данных, и в этом случае этот метод столь же неточный, как и регулярное время, поэтому он не имеет большого преимущества. Это облом, но имеет смысл, спасибо! – Xilo27

+0

Я понял другую часть, которую вы добавили уже, это было не то, о чем я просил, - но, во всяком случае, спасибо, что все альтернативные варианты (которые не осуществимы) хорошо подходят. – Xilo27

0

реализация Java:

int start = System.currentTimeMillis(); 

//Code to be timed... 

int end = System.currentTimeMillis(); 
System.out.println(end - start); 
+0

Да, конечно, но это не было, я говорил. Этот метод является неточным - чтобы получить число, близкое к точному времени вашего кода, вы должны запускать его снова и снова, а затем усреднять результаты (что является болью). Вместо этого, поскольку нам действительно все равно, сколько времени требуется, только относительное время, можем ли мы абстрагироваться и вычислить то, что я описывал выше? – Xilo27

+0

Чтобы быть справедливым, конечно, иногда время имеет значение. Но в других случаях мы просто сравниваем один алгоритм с другим, и в этом случае относительные точные результаты гораздо более полезны и надежны. – Xilo27

+0

@ Xilo27, чтобы приблизиться к тому, что вы ищете, не усредняйте, берете минимум. «Истинное» время работы всегда будет меньше, чем когда бы вы ни наблюдали. Если ваш скрипт достаточно мал, истинное время выполнения может даже быть * самым коротким временем, которое вы наблюдаете (если вам повезло с системными вызовами). Для реального мира, да, усредняйте это. – Dave

0

Если запустить все программы в той же машине и использовать время от Proccess не реальное время работы результаты должны быть очень accurrate. Взгляните на класс Proccess в .NET Framework, чтобы легко понять это (он содержит свойства, которые дают вам UserTime и KernelTime самого процесса), и этот класс является хорошим драйвером для API pro proxy. Другим взглядом на анализ выполнения алгоритма или его завершенности является нотация O, которая потребует глубокого анализа кода, проблема с которой заключается в том, что каждая операция не занимает одно и то же время, вся эта теория затухает для идеальной машины. Maibe для чего-то подобного вам потребуются переводчики для всех языков, которые вы хотите поддержать, и сделайте все, что будет чрезвычайно сложным.

+0

Приятно, спасибо, это начало, но проблема в том, что с большинством компьютеров операционная система заставляет запускать сразу несколько программ на вашем процессоре (рабочий стол мыши и т. Д., А также программа). Это неизбежно приводит к неточностям времени, многие из которых находятся вне вашего контроля. Это плюс такие вещи, как автоматическая сборка мусора, которая не имеет ничего общего с временем выполнения самого алгоритма, приводит к большему количеству неточностей, которые предотвращают точное сравнение. – Xilo27

+0

Проверьте класс Proccess (2 свойства, о которых я упомянул ранее), он даст вам реальное время процесса, а не время, которое вы считаете человеком, оно даст вам время, затрачиваемое на него. – Asav

+0

А я вижу, извините, я вас неправильно понял, Proccess - это ваша конкретная программа, которая работает, а не сам процессор.В этом случае это кажется удивительным - почему мы обычно не используем это вместо миллисов и так для временного кода? И знаете ли вы, есть ли эквивалент java? (класс Java Process, похоже, не имеет аналогичных функций) – Xilo27

Смежные вопросы