тайминг кода — рассчитывает ли clock_t время всех потоков, c ++, pthreads?

Допустим, мой код сделан из main (), и в main я вызываю 2 потока, которые работают параллельно.

Допустим, что для завершения main требуется 5 секунд, а для завершения каждого потока — 10 секунд.

если я синхронизирую основную программу с помощью clock_t, предполагая, что 2 потока работают параллельно, реальное время, которое займет программа, составляет 15 секунд.

Теперь, если я рассчитываю время с помощью clock_t, это даст мне время 15 секунд или 25 секунд?

Хотя поток 1 и поток 2 выполняются параллельно, будет ли clock_t () рассчитывать каждый цикл, используемый потоком 1 и потоком 2, и возвращать общее количество используемых циклов?

Я использую windows mingw32 и pthreads.

пример кода:

main(){
clock_t begin_time ;

for (unsigned int id = 0; id < 2; ++id)
{
pthread_create(&(threads[id]), NULL, thread_func, (void *) &(data[id]));
}for (unsigned int id = 0; id < 2; ++id)
{
pthread_join(threads[id], NULL);
}

time = double( clock () - begin_time )/CLOCKS_PER_SEC;
}

2

Решение

Функция clock делает разные вещи в разных реализациях (в частности, в разных ОС). clock Функция в Windows дает количество тактов с момента запуска вашей программы, независимо от количества потоков, и независимо от того, занята машина или нет [Я считаю, что это дизайнерское решение связано с древними временами, когда DOS и Windows 2.x были модные вещи в использовании, и у ОС не было способа «не запускать» что-то].

Насколько мне известно, в Linux он показывает используемое процессорное время, как и во всех Unix-подобных операционных системах.

Изменить, чтобы уточнить: Моя система Linux говорит это:

В glibc 2.17 и более ранних версиях clock () была реализована с опережением времен (2).
Для повышения точности, начиная с glibc 2.18, он реализован поверх
clock_gettime (2) (с использованием часов CLOCK_PROCESS_CPUTIME_ID).

Другими словами, время для процесса, а не для текущего потока.

Чтобы получить фактическое время процессора, используемое вашим процессом, если вы используете Windows, вы можете (и должны) использовать GetProcessTimes

2

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector