Можно ли использовать clock () как надежный API для измерения времени, затрачиваемого ЦП на выполнение фрагмента кода? При проверке usng times () / clock () оба, похоже, не измеряют время процессора точно.
Во-первых, можно ли использовать API-интерфейс clock () / times () для измерения времени выполнения функции / фрагмента кода, как показано в примере ниже? Есть ли лучшая и надежная альтернатива? Механизм заключается в том, чтобы работать в Linux, HP-UX, IBM-AIX и Sun Solaris, поскольку нам необходимо измерять (и сравнивать) производительность фрагмента кода на всех этих платформах.
Пожалуйста, предложите. Кроме того, пожалуйста, дайте мне знать, если что-то упущено.
bbb@m_001:/tmp/kk1$ ./perf_clock 102400
{clock(): S 0 E 0 D 0.0000000000}
bbb@m_001:/tmp/kk1$ ./perf_clock 204800
{clock(): S 0 E 10000 D 0.0100000000}
bbb@m_001:/tmp/kk1$ cat perf_clock.c
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
void test_clock(char* sbuf, int* len){
clock_t start, end; int i=0;
start = clock();
while(i++ < 500) memset((char*)sbuf,0,*len);
end = clock();
printf("{clock(): S %10lu E %10lu D %15.10f}\n",
start,end,(end-start)/(double) CLOCKS_PER_SEC);
}
int main(int argc,char* argv[])
{
int len=atoi(argv[1]);
char *sbuf=(char*)malloc(len);
test_clock(sbuf,&len);
free(sbuf); return 0;
}
Результаты, похоже, говорят о том, что memset () 100 КБ, 500 раз, не тратит время. Или это говорит о том, что это невозможно измерить в микросекундах?
На самом деле, это не memset (), а другая функция [которая подготавливает огромную структуру размером около 1 МБ, размещает копию этой структуры, выделяет в БД Oracle и заполняет эти структуры данными из БД], которая пытается измерения. Даже это показывает 0 тиков, и это сбило меня с толку.
Спасибо!