Необходимо определить время затраченное на выполнения отдельных функций, циклов и т.д. в программе С/C++ с точностью до сотых или даже тысячных долей секунды. Как это сделать?
Один из способов -- читать счетчик тиков процессора.
Макрос для gcc
#define rdtscll(val) __asm__ __volatile__("rdtsc" :"=A"(val))
// Type of val --- unsigned long long
#endif
rdtscll(long long & val) записывает в переменную
val число тиков процессора с момента перезагрузки машины.
Сам вызов функции занимает около 30 тиков.
Все современные процессоры обладают кэшем (область быстродоступной
памяти), если данные находятся в кэше то доступ к ним относительно
бесплатен, если данные находятся в далекой области памяти то
доступ занимает гораздо больше времени. Поэтому, первый вызов
кода может выполняться значительно дольше чем, последующие, и для
правильного измерения времени необходимо несколько раз повторить
процесс.
Пример измерения времени выполнения функции sqrt.
int main(){
const int num=7;
long long c1[num], c2[num];
double tmp;
for (int i=0; i<num; i++){
rdtscll(c1[i]);
tmp=sqrt(d2*i);
rdtscll(c2[i]);
}
for (int i=0; i<num; i++) cout << c2[i]-c1[i] << '\t';
cout << endl;
return 0;
}
Результатом выполнения будет примерно следующая строка:
5906 113 113 113 113 113 113
Таким образом, тело цикла занимает 113 тиков, из них приблизительно 40 тиков занимает работа со счетчикам, и на sqrt остается 73.
Точность измерений таким способом составляет примерно 20 тиков. Большей точности не добиться, так как время выполнения
начинает зависеть от того какой код окружает измеряемый участок.
Эта ошибка может составляет примерно 10-20 тиков, конечно без провала
на первый вызов.
да да меряй дальше на не real-time системе =) Каждый раз разные значения - точно не узнаешь, в списке расслыки linux-c-development - тред такой был - меряли по разному итог один - не измерить точно =)