Единица времени, используемая функцией clock
, является произвольной. На большинстве платформ он не связан с скоростью процессора. Это чаще всего связано с частотой внешнего прерывания таймера, который может быть сконфигурирован в программном обеспечении, или с историческим значением, которое было сохранено для совместимости через годы эволюции процессора. Вам нужно использовать макрос CLOCKS_PER_SEC
для преобразования в реальном времени.
printf("Total time taken by CPU: %fs\n", (double)total_t/CLOCKS_PER_SEC);
Стандартная библиотека C был разработан, чтобы быть осуществимой на широком спектре аппаратных средств, в том числе процессоров, которые не имеют внутреннего таймера и опирающихся на внешней периферии, чтобы сообщить время. На многих платформах есть более точные способы измерения времени настенных часов, чем time
, и более точные способы измерения потребления процессора, чем clock
. Например, в системах POSIX (например, Linux и других Unix-подобных системах) вы можете использовать getrusage
с точностью до микросекунды.
struct timeval start, end;
struct rusage usage;
getrusage(RUSAGE_SELF, &usage);
start = usage.ru_utime;
…
getrusage(RUSAGE_SELF, &usage);
end = usage.ru_utime;
printf("Total time taken by CPU: %fs\n", (double)(end.tv_sec - start.tv_sec) + (end.tv_usec - start.tv_usec)/1e-6);
При наличии, clock_gettime(CLOCK_THREAD_CPUTIME_ID)
или clock_gettime(CLOCK_PROCESS_CPUTIME_ID)
может дать более высокую точность. Он имеет наносекундную точность.
Обратите внимание на разницу между точностью и точностью: точность - это единица, о которой сообщаются значения. Точность заключается в том, насколько близкие значения приведены к реальным значениям. Если вы не работаете с real-time system, нет никаких твердых гарантий относительно того, сколько времени занимает часть кода, включая вызов самих измерительных функций.
Некоторые процессоры имеют цикл часы, которые рассчитывают процессорные циклы, а не часы настенных часов, но это становится очень специфичным для системы.
Когда вы делаете тесты, будьте осторожны, что то, что вы измеряете, - это выполнение этого конкретного исполняемого файла на этом конкретном CPU в этих конкретных обстоятельствах, и результаты могут или не могут быть обобщены в других ситуациях. Например, пустой цикл в вашем вопросе будет оптимизирован большинством компиляторов, если вы не отключите оптимизацию. Измерение скорости неоптимизированного кода обычно бессмысленно. Даже если вы добавите настоящую работу в цикл, остерегайтесь игрушечных тестов: они часто не имеют одинаковых характеристик производительности, таких как код реального мира. На современных высокопроизводительных ЦП, таких как найденные на ПК и смартфонах, тесты кода, интенсивно использующего процессор, часто очень чувствительны к эффектам кеша, и результаты могут зависеть от того, что еще работает в системе, от точной модели процессора (из-за разных размеры и макеты кеша), по адресу, на котором загружается код, и т. д.
Чтобы получить время в секундах, вы должны разделить это число, например 'total_t' в вашем случае с' CLOCKS_PER_SEC'. Обратите внимание, что вам нужно указать 'total_t' значение плавающей запятой для его работы. –
Также небольшая штриховка по вашей схеме именования: Символы, заканчивающиеся суффиксом '_t', обычно используются для псевдонимов типов (как создается с помощью' typdef'). Например, 'size_t' или' time_t' и даже 'clock_t'. –
@JoachimPileborg Я просмотрел документацию для функции clock(), и CLOCK_PER_SEC вернет точное время до 1/100th секунды, и я ищу разрешение до 10 микросекунд, поэтому я использовал упомянутый подход. Также я хочу, чтобы это работало на разных платформах и архитектурах, поэтому я подумал, что просто вычисление разницы, а затем умножение на тактовую частоту будет лучшим вариантом, так как CLOCKS_PER_SEC изменится с архитектурой. – user2808264