2016-11-15 2 views
-1

Известна временная сложность кода. Система, на которой была выполнена программа, - это Intel Corei3 с двухъядерным процессором и процессором с частотой 2,4 ГГц - она ​​имеет 4 логических процессора. С этими подробностями, как можно вычислить время выполнения кода?С известными и известными системными часами O (n) можно рассчитать время выполнения кода

public class PerfmTest { 
    public static void main(String[] args) { 
     getexeTime(1000000); 
    } 

    public static void getTime (long n) { 
     // long startTime = System.currentTimeMillis(); 
     long startTime = System.nanoTime(); 
     long k = 0; 
     for (int i = 1; i <=5; i++) { 
      // k = k + 5; 
     } 
     // long endTime = System.currentTimeMillis(); 
     long estimatedTime = System.nanoTime() - startTime; 
     //System.out.println("Execution time for n = " + n + " is " + (endTime - startTime) + " milliseconds"); 
     System.out.println("Execution time for n = " + n + " is " + estimatedTime + " nanoseconds"); 
    } 
} 

Выходной сигнал составлял 855 наносекунд.

+1

Я предполагаю, что вы не знали, что код без видимых побочных эффектов может быть оптимизирован во время компиляции. Независимо от того, что ** вы пытаетесь достичь с помощью этого упражнения? –

+0

Я знаю, что код оптимизирован. Но точка в том, как в теории ее O (n) и как она работает с двумя двойными ядрами. Я работаю над проектом учебной помощи. – Uma

+2

Теоретически это не O (n), потому что компилятор может исключить цикл (вы никогда не читаете 'k' после цикла - так что никаких побочных эффектов для его удаления нет, даже если вы добавите дополнение теория). Таким образом, ваш текущий код, теоретически, «O (1)». Кроме того, будьте осторожны с микро-бенчмарками. Существует JIT, и холодные прогоны отличаются от теплых пробегов (и для запуска JIT может потребоваться несколько прогонов). –

ответ

1

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

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

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

Я испытал эти эффекты из первых рук во время выполнения тестов производительности. Один и тот же набор тестов будет производить разные тайминги, если компьютер сидит без дела дольше, или если последний загрузочный режим был холодным, а не резервным/возобновленным, и т. Д.

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

Единственное, что мы можем сделать с любым разумным ожиданием успеха, - предсказать, что алгоритм A будет работать лучше, чем алгоритм B (и даже это иногда приводит к неожиданным результатам для разных входов, размеров ввода и т. Д.). We не может точно предсказать, как долго будет выполняться алгоритм A.

Резюме

Без чрезвычайно контролируемой среды (выходит за рамки этого вопроса), невозможно рассчитать, оценку, или даже измерять время выполнения произвольного фрагмента кода.

+0

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

+1

@Bohemian Мы можем сделать очень хорошие оценки алгоритмов относительно друг друга - я определенно согласен с этим. Мы не можем делать очень хорошие оценки во всех абсолютных таймингах, именно потому, что мы не можем разумно оценить время обработки на итерацию. Он будет отличаться от компилятора, аппаратного обеспечения, состояния системы, программного обеспечения и многих дополнительных факторов; кроме того, эти вариации часто бывают нетривиальными. Это только мой опыт работы в качестве профессионального аналитика. – nhouser9

+0

@ Nhouser9, поэтому суть в том, что используется только для сравнения. – Uma

-1

С O (N) известных и системными часами известно, мы можем вычислить время выполнения кода.

No. O (N) лишь означает, что время выполнения растет линейно с N, т.е.с помощью линейного уравнения вида

t = aN+b 

где y это время, N является N и a и b являются константами, но это не говорит вам константы.

+0

Получил изображение O (n), что мы не можем вычислить время выполнения. – Uma

+0

Я не могу отметить два решения, о которых говорит сайт, хотя я хотел отметить его как решение. – Uma

+0

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

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