Запуск кода ровно на одну секунду

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

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

Вот интересная часть моего кода:

int size = 256
clock_t start_benching = clock();
for (uint32_t i = 0;i < size; i+=4)
{
    myarray[i];
    myarray[i+1];
    myarray[i+2];
    myarray[i+3];
}
clock_t stop_benching = clock();

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

Я хочу запустить код на одну секунду и посмотреть, сколько операций было сделано.

Это строка для печати измерения времени:

printf("Walking through buffer took %f seconds\n", (double)(stop_benching - start_benching) / CLOCKS_PER_SEC);

person user3694354    schedule 19.08.2014    source источник
comment
Внешний цикл, который продолжается до тех пор, пока не пройдет требуемое время?   -  person Some programmer dude    schedule 19.08.2014
comment
Примечание: см. этот вопрос для более точного эталона.   -  person Al.Sal    schedule 19.08.2014
comment
Я бы посоветовал сделать наоборот, найти количество итераций, которое выполняется примерно за секунду, а затем поиграть с оптимизацией, используя такое же количество итераций. Функции времени не очень точны, поэтому у вас будет определенное количество вариаций от запуска к запуску.   -  person dohashi    schedule 19.08.2014
comment
ой забыл последнюю строчку. отредактировал и добавил   -  person user3694354    schedule 19.08.2014
comment
Обратите внимание, что 1-секундная метка может появиться, скажем, при вычислении i+2 перед третьим поиском myarray. Ожидаете ли вы, что он немедленно прервет цикл (середина оператора) или завершит текущую итерацию (что занимает дополнительное время после отметки в 1 секунду)?   -  person Wyzard    schedule 19.08.2014
comment
Если вы просто хотите увидеть, на что тратится время в коде, вы просто используете профилировщик, например, gprof: sourceware.org/binutils/docs/gprof/index.html - не усложняйте себе задачу...   -  person Spacedman    schedule 19.08.2014
comment


Ответы (2)


Лучший подход к бенчмаркингу — знать процент времени, потраченный на каждый раздел кода. Вместо того, чтобы заставить ваш код работать ровно 1 секунду, сделайте stop_benchmarking - start_benchmarking для общего времени выполнения - возьмите время, затраченное на любую часть кода, и разделите на общее время выполнения, чтобы получить значение от 0 до 1. Умножьте это значение на 100. и у вас есть % времени, затраченного на этот конкретный раздел.

person Dennis C Furlaneto    schedule 19.08.2014

Совет, который не дает ответа: используйте настоящий профилировщик для профилирования производительности разделов кода.

В *nix вы можете установить alarm(2) с помощью обработчик сигнала, который устанавливает глобальный флаг для указания прошедшего времени. API Windows предоставляет нечто подобное с SetTimer.

#include <unistd.h>
#include <signal.h>

int time_elapsed = 0;

void alarm_handler(int signal) {
  time_elapsed = 1;
}

int main() {
  signal(SIGALRM, &alarm_handler);
  alarm(1); // set alarm time-out to 1 second

  do {
    // stuff...
  } while (!time_elapsed);

  return 0;
}

В более сложных случаях вы можете использовать setitimer(2) вместо alarm(2), который позволяет

  • использовать микросекундную точность и
  • choose between counting
    • wall clock time,
    • процессорное время пользователя или
    • пользовательское и системное процессорное время.
person David Foerster    schedule 19.08.2014