Как я могу измерить время выполнения цикла for? - PullRequest
1 голос
/ 12 ноября 2009

Я хочу измерить время выполнения для циклов на различных платформах, таких как php, c, python, Java, javascript ... Как его измерить?

Я знаю эти платформы, поэтому я говорю об этом:

 for (i = 0; i < 1000000; i++)
 {

 }   

Я не хочу ничего измерять в цикле.

Немного модификация:

@ all Некоторые из моих друзей говорят, что компилятор оптимизирует этот код, делая этот цикл бесполезным. Я согласен с этим. мы можем добавить небольшой оператор, например, некоторый инкрементный оператор, но на самом деле я просто хочу вычислить время выполнения каждой итерации в цикле на разных языках. Добавление инкрементного оператора сложит время выполнения, и это повлияет на результаты, причины на разных платформах, время выполнения для увеличения значения также будет разным, что сделает результат бесполезным. Короче говоря, лучше спросить:

Я ХОЧУ РАСЧЕТИТЬ ВРЕМЯ ИСПОЛНЕНИЯ ПЕРИОДИЗАЦИИ В ПЕТЛЕ НА РАЗНЫХ ПЛАТФОРМАХ ... КАК ЭТО СДЕЛАТЬ ??? редактировать ---

Я узнал о Python Profilers Модули профилировщика ... которые оценивают время процессора ... абсолютное время .. Любые предложения ??? Тем временем я работаю над этим ...

Ответы [ 12 ]

5 голосов
/ 12 ноября 2009

Хотя был дан ответ для C ++, из вашего описания («[Вы] не хотите ничего измерять в цикле») видно, что вы пытаетесь измерить время, которое требуется программе для итерации через пустой цикл.

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

2 голосов
/ 12 ноября 2009

Правильный способ сделать это в Python - запустить timeit из командной строки:

$ python -m timeit "for i in xrange(100): pass"
100000 loops, best of 3: 2.5 usec per loop
2 голосов
/ 12 ноября 2009

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

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

Я бы начал с программы, которая ничего не делает, кроме вашего цикла, и (по крайней мере, в среде Linux) делает time you-prg-executable.

Тогда я бы исследовал, есть ли инструменты, которые работают как time. Не уверен, но я бы посмотрел на JRat для Java и gcc gcov для C и C ++. Без сомнения, есть подобные инструменты для других языков. Но, конечно, вам нужно посмотреть, дают ли они реальное время или нет.

2 голосов
/ 12 ноября 2009

1001 * Javascript *

start = new Date;
for(var i = 0; i < 1000000; i++) {}
time = new Date - start;
1 голос
/ 12 ноября 2009

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

1 голос
/ 12 ноября 2009

Если вы используете Python, вы можете использовать модуль, специально созданный для измерения времени. Это называется Timeit.

Вот пара ссылок, которые я нашел (просто прогуглил):

  1. Погружение в Python: использование времени Модуль
  2. Документация Python: Модуль времени

А вот пример кода для быстрого начала работы:

import timeit
t = timeit.Timer("for i in range(100): pass", "")
# Timeit will run the statement 1,000,000 times by default, and return the time it took for all the runs together (it doesn't try to average them out or anything).
t.timeit()
2.9035916423318398 # This is the result. Don't forget (like I did in an earlier edit) that this is the result of running the code 1,000,000 times!
1 голос
/ 12 ноября 2009

Другая версия в PHP, которая не требует никаких дополнительных вещей:

$start = microtime(true);

for (...) {
   ....
}

$end = microtime(true);

echo ($end - $start).' seconds';
0 голосов
/ 12 ноября 2009

Для Java оба Apache Commons Lang и Spring Framework имеют StopWatch (см. Документ по Java для Apache здесь ), которые вы можете использовать как способ измерения времени выполнения. Под прикрытием это просто вычитание System.currentTimeMillis(), и это не спасает вас так много кода, чтобы использовать эту утилиту.

0 голосов
/ 12 ноября 2009

К моменту: просто получите текущее время до выполнения чего-либо (это время начала ) и получите текущее время после выполнения чего-либо (это это время окончания ), а затем просто начните учиться в начальной школе, чтобы получить истекшее время. Каждый API предоставляет способы узнать текущее время. Например, в Java это System.currentTimeMillis() и System.nanoTime().

Но : особенно в Java прошедшее время не всегда так надежно. Могут быть микродифференцировки, и это также сильно зависит от того, как вы проводите тесты. Я видел обстоятельства, когда в test2 () он быстрее, чем test1 (), потому что он выполняется немного позже и он становится медленнее , когда вы переставляете выполнение в test2 () и затем test1 ().

И последнее, но не менее важное: микрооптимизация - корень всего зла.

0 голосов
/ 12 ноября 2009

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

Для сравнения скорости языков вам понадобится реальный алгоритм, такой как "Сортировка слиянием", "Бинарный поиск" или, возможно, "Dijkstra", если вы хотите что-то сложное. Реализуйте один и тот же алгоритм на всех языках, затем сравните.

Вот эталонный тест алгоритма биоинформатики. текст ссылки Проверить страницу результатов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...