2012-07-04 3 views
0

я делаю некоторые тривиальные бенчмаркинг написания х строк одного и того же текста в файл, используя два метода:Измерение максимального и минимального времени выполнения определенной функции

  1. Прямая FWRITE.

  2. Создать новую тему, и связь осуществляется через асинхронную очередь (основной поток вставляется с одной стороны, а другой поток считывается с другой). Этот метод используется, чтобы попытаться свести к минимуму медленной записи (из-за смыв)

Это фрагмент кода, который должен дать общее представление о программе:

int i; 
char * buf; 
int buf_size; 
double local_start, local_end, global_start, global_end; 
double slowest, fastest; 
double local_time_difference; 

buf = "A string to be printed to a file \n"; 
buf_size = strlen(buf); 
fastest = MAX_WRITE_TIME; 
slowest = 0; 

logger_init(atoi(argv[1])); 


global_start = get_time(); 
for(i = 0 ; i < 100000000 ; i++) 
{ 
    local_start = get_time(); 
    logger_write(buf, buf_size); 
    local_end = get_time(); 

    local_time_difference = local_end-local_start; 

    if(local_time_difference < fastest && local_time_difference != 0) 
     fastest = local_time_difference; 

    if(local_time_difference > slowest) 
     slowest = local_time_difference; 

    if(i % 10000 == 0) 
     usleep(1); 
} 
global_end = get_time(); 



printf("Fastest: %1.9f\nSlowest: %1.9f\nTotal Time: %1.9f\n", fastest, slowest, global_end-global_start); 
logger_destroy(); 

Получить процедуру времени возвращения время в микросекундах

double get_time() 
{ 
    struct timeval t; 
    struct timezone tzp; 
    gettimeofday(&t, &tzp); 
    return t.tv_sec + t.tv_usec*1e-6; 
} 

в зависимости от аргумента, переданного logger_init, logger_write либо непосредственно записать в файл или вставить его в очередь (размер очереди не должно превышать сома особый предел). GAsyncQueue Используется

Метод, который я использую для вычисления самой быстрой и медленной записи, безусловно, работает, но мой вопрос: есть ли инструмент или профайлер, который сделает это для меня? т.е. дать мне статистику о каждой функции (максимум, минимум и средний вызов)

Инструменты, которые я пытался до сих пор, но не везло с:

  • дргоЕ
  • Увеличить
  • KCacheGrind
  • VTune

TL: DR Я вот oking для инструмента, чтобы дать мне минимальное, максимальное и среднее время выполнения определенной функции, а не общее время.

+1

Вы можете получить более точную точность с функцией времени с более высоким разрешением, например clock_gettime (при условии, что linux) или QueryPerformanceCounter на окнах – mathematician1975

ответ

0
  • Используйте правильные функции OS API высокого разрешения для бенчмаркинга.
  • Не вычисляйте время выполнения из самого измерения, особенно не, если вы используете числа с плавающей точкой.
  • Почему вы называете функцию сна? Вы пытаетесь принудительно переключить контекст или какую-то странность? ОС, скорее всего, справится с такими лучшими и эффективными, чем ваша программа.
+0

Я использовал clock_gettime, но по какой-то причине я скопировал неправильную версию. Вы можете видеть, что я печатаю девятый плавающий номер. Что касается вашего второго пункта, вы предлагаете мне хранить результаты в структуре данных (два массива?) И выполнять вычисления за пределами ?. Что касается сна, я пытаюсь имитировать пример реального мира (уменьшить скорость получения сообщений) –

Смежные вопросы