Как я могу получить время выполнения программы в миллисекундах в C?

В настоящее время я получаю стенное время выполнения своей программы в секундах путем вызова:

time_t startTime = time(NULL);
//section of code
time_t endTime = time(NULL);
double duration = difftime(endTime, startTime);

Действительно ли возможно получить стенное время в миллисекундах? Раз так, как?

10
задан Jonathan Leffler 9 April 2012 в 14:10
поделиться

6 ответов

Если вы используете POSIX-машину, используйте вместо нее gettimeofday () ; это дает вам разумную портативность и разрешение в микросекундах.

Немного более эзотерическим, но и в POSIX является функция clock_gettime () , которая дает наносекундное разрешение.

Во многих системах вы найдете функцию ftime () , которая фактически возвращает вам время в секундах и миллисекундах. Однако его больше нет в спецификации Single Unix (примерно такой же, как POSIX). Вам нужен заголовок :

struct timeb mt;
if (ftime(&mt) == 0)
{
     mt.time ... seconds
     mt.millitime ... milliseconds
}

Он восходит к версии 7 (или 7-го издания) Unix, по крайней мере, поэтому он был очень широко доступен.

У меня также есть примечания в моем коде субсекундного таймера на times () и clock () , которые снова используют другие структуры и заголовки. У меня также есть заметки о Windows, использующей clock () с 1000 тактов в секунду (время в миллисекундах) и более старый интерфейс GetTickCount () , который отмечен как необходимый в Windows 95, но не на NT.

9
ответ дан 4 December 2019 в 01:00
поделиться

Если вы можете сделать это вне самой программы, в Linux вы можете использовать команду time ( time ./ моя_программа ).

3
ответ дан 4 December 2019 в 01:00
поделиться

На Windows используйте QueryPerformanceCounter и связанную с ним частоту QueryPerformanceFrequency. Они не дают времени, переводимого в календарное время, поэтому при необходимости запросите время с помощью CRT API и сразу же используйте QueryPerformanceCounter. Затем можно сделать некоторое простое сложение/вычитание для вычисления календарного времени, с некоторой ошибкой из-за времени, необходимого для последовательного выполнения API. Эй, это же компьютер, а чего вы ожидали???

-4
ответ дан 4 December 2019 в 01:00
поделиться

Можно использовать функцию time модуля strptime () :

import time
date = input('Date (mm/dd/yyyy): ')
try:
  valid_date = time.strptime(date, '%m/%d/%Y')
except ValueError:
  print('Invalid date!')

Обратите внимание, что в Python 2 .x необходимо использовать raw _ input вместо input .

-121--1736540-

Хэш-таблица реализует карту . Функция Map.entureSet возвращает коллекцию ( Наборы ) экземпляров Map.Entry , имеющих методы getKey и getValue .

Итак:

Iterator<Map.Entry>  it;
Map.Entry            entry;

it = yourTable.entrySet().iterator();
while (it.hasNext()) {
    entry = it.next();
    System.out.println(
        entry.getKey().toString() + " " +
        entry.getValue().toString());
}

Если известны типы записей в хэш-таблице, можно использовать шаблоны для исключения вызовов toString выше. Например, запись может быть объявлена как Map.Entry < Последовательность, Последовательность > , если хэш-таблица объявлена как Хэш-таблица < Последовательность, Последовательность > .

Если вы можете комбинировать шаблоны с дженериками, это просто коротко:

for (Map.Entry<String,String> entry : yourTable.entrySet()) {
    System.out.println(entry.getKey() + " " + entry.getValue());
}

Это предполагает, что ваша таблица является хэш-таблицей < Последовательность, Последовательность > . Просто покажет, как далеко Ява зашла за последние несколько лет, в значительной степени не потеряв свой существенный Java-ness.

Немного OT: Если синхронизация не требуется, используйте HashMap вместо Hashtable . В этом случае используйте ConcurrentHashMap (спасибо, акаппа!).

-121--3783495-

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

Он будет работать как время (NULL), но будет возвращать количество миллисекунд вместо секунд из эпохи Unix в окнах и Linux.

Вот код

#ifdef WIN32
#include <Windows.h>
#else
#include <sys/time.h>
#include <ctime>
#endif

/* Returns the amount of milliseconds elapsed since the UNIX epoch. Works on both
 * windows and linux. */

int64 GetTimeMs64()
{
#ifdef WIN32
 /* Windows */
 FILETIME ft;
 LARGE_INTEGER li;
 uint64 ret;

 /* Get the amount of 100 nano seconds intervals elapsed since January 1, 1601 (UTC) and copy it
  * to a LARGE_INTEGER structure. */
 GetSystemTimeAsFileTime(&ft);
 li.LowPart = ft.dwLowDateTime;
 li.HighPart = ft.dwHighDateTime;

 ret = li.QuadPart;
 ret -= 116444736000000000LL; /* Convert from file time to UNIX epoch time. */
 ret /= 10000; /* From 100 nano seconds (10^-7) to 1 millisecond (10^-3) intervals */

 return ret;
#else
 /* Linux */
 struct timeval tv;
 uint64 ret;

 gettimeofday(&tv, NULL);

 ret = tv.tv_usec;
 /* Convert from micro seconds (10^-6) to milliseconds (10^-3) */
 ret /= 1000;

 /* Adds the seconds (10^0) after converting them to milliseconds (10^-3) */
 ret += (tv.tv_sec * 1000);

 return ret;
#endif
}

Вы можете изменить его, чтобы вернуть микросекунды вместо миллиэсконд, если хотите.

3
ответ дан 4 December 2019 в 01:00
поделиться

Я всегда использую первый. Второй, по-видимому, способ защиты от jquery переопределяется. Одна из причин, по которой вы можете это сделать, - если вы не знаете, какие другие сценарии будут загружены на страницу. Если все ваши вещи зависят, скажем, от jquery 1.3, и вы находитесь в среде, где вы не контролируете всю страницу, ваш код может сломаться, если кто-то загрузится в jquery 1.4. Звучит уродливо, но такое случается. Таким образом, вы можете прикрыть свою задницу, создав замыкание сразу после загрузки jquery, и держа свою версию jquery внутри этого замыкания. Я думаю, это то, что происходит во втором примере.

Ни один из них фактически не инициализирует jquery. Jquery заботится о любой инициализации, которая ему нужна самостоятельно. По-прежнему, вполне вероятно, что вы будете использовать первый пример, даже если бы вы использовали второй, вы бы просто поместить $ (документ) .ready внутри функции во втором примере.

-121--1256265-

У меня также была та же проблема и решение, что и у Рика, за исключением того, что я импортировал существующий .edmx в новый проект, и хотя базовое пространство имен не имело значения, оно было импортировано в другую подкаталогу, поэтому я также должен был обновить последовательность соединения в Web.Config в трех местах, чтобы включить различные подкаталоги

-121--1778439-

Библиотека GLib с открытым исходным кодом имеет систему GTimer, которая утверждает, что обеспечивает микросекундную точность. Эта библиотека доступна в Mac OS X, Windows и Linux. В настоящее время я использую его для выполнения тайминга производительности в Linux, и он, кажется, работает идеально.

0
ответ дан 4 December 2019 в 01:00
поделиться

gprof , который является частью инструментария GNU, является опцией. В большинстве систем POSIX он будет установлен, и он доступен в Cygwin для Windows. Самостоятельное отслеживание времени с помощью gettimeofday () работает нормально, но по производительности эквивалентно использованию операторов печати для отладки. Это хорошо, если вам просто нужно быстрое и грязное решение, но это не так элегантно, как использование подходящих инструментов.

Чтобы использовать gprof , вы должны указать опцию -pg при компиляции с gcc как в:

gcc -o prg source.c -pg

Затем вы можете запустить gprof на сгенерированном запрограммируйте следующим образом:

gprof prg > gprof.out

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

Существует большое количество параметров, которые можно установить с помощью gprof . Если вам интересно, дополнительную информацию можно найти на страницах руководства или через Google.

0
ответ дан 4 December 2019 в 01:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: