Измерьте время настенных часов до и после функции - PullRequest
0 голосов
/ 01 февраля 2020

Я измеряю время на стене с помощью функции clock_gettime (), найденной в. Он прекрасно работает, когда я использую его в main (), но не так, как я пытаюсь его использовать.

Я знакомлюсь с планировщиком linux и измеряю производительность в разных частях. Я хочу, чтобы можно было измерить Время ожидания , которое определяется как "общее время, которое поток проводит в очереди готовности" (сколько времени до начала выполнения функции).

Достаточно легко Я могу измерить это, установив clock_gettime () перед функцией потока и другой прямо внутри функции. Однако проблема, с которой я сталкиваюсь, заключается в том, что время внутри функции потока меньше, чем у внешней, что дает нам отрицательное время.

Я запускаю это на своем windows p c через ubuntu.

в чем может быть проблема?

код:

    clock_gettime(CLOCK_REALTIME,&data.before);
    thread_array[i-1] = data;
    if(pthread_create(&tids[i],&attr,workLoad,(void*) &data) != 0){
                perror("Could not create thread");
                return 1;
            }
        }

    for(int i = 1;i < threadAmount; i++){
            if(pthread_join(tids[i],NULL)!= 0){
                perror("Thread could not wait");
                return 1;
            }
        }

и вот мой поток c:

void *workLoad(void *args) 
{   
    threadData* data = (threadData*) args;
    clock_gettime(CLOCK_REALTIME,&data->after);
    int loopAmount = data->loopAmount;
    int counter = 0;
    for(int i = 0; i < loopAmount; i++){
        counter++;
    }
    return NULL; 
}

результат интервала времени

enter image description here

1 Ответ

1 голос
/ 02 февраля 2020

В следующем коде:

clock_gettime(CLOCK_REALTIME,&data.before);
thread_array[i-1] = data;
if(pthread_create(&tids[i],&attr,workLoad,(void*) &data) != 0){

data представляется локальной переменной, адрес которой вы передаете потоку. Вы также копируете эту переменную в thread_array[i-1]. Если вы затем выполните thread_array[i-1].after - thread_array[i-1].before, то это означает, что поток обновляет неправильную переменную. Вам нужно передать &thread_array[i-1] этой теме, например:

if(pthread_create(&tids[i],&attr,workLoad,(void*)&thread_array[i-1]) != 0){
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...