2012-04-14 3 views
6

Это «алгоритм», но когда я хочу измерить время выполнения, он дает мне нуль. Зачем?C как правильно измерить время?

#define ARRAY_SIZE 10000 
... 

clock_t start, end; 

start = clock(); 

for(i = 0; i < ARRAY_SIZE; i++) 
{ 
non_parallel[i] = vec[i] * vec[i]; 
} 
end = clock(); 
printf("Number of seconds: %f\n", (end-start)/(double)CLOCKS_PER_SEC); 

Так что я должен сделать, чтобы измерить время?

ответ

14

Две вещи:

  1. 10000 не много на современном компьютере. Поэтому этот цикл будет работать, вероятно, меньше миллисекунды - меньше точности clock(). Поэтому он вернет ноль.

  2. Если вы не используете результат non_parallel, возможно, что весь цикл будет оптимизирован компилятором.

Скорее всего, вам просто нужен более дорогой цикл. Попробуйте увеличить ARRAY_SIZE к чему-то значительно большему.


Вот тест на моей машине с большим размером массива:

#define ARRAY_SIZE 100000000 

int main(){ 

    clock_t start, end; 

    double *non_parallel = (double*)malloc(ARRAY_SIZE * sizeof(double)); 
    double *vec   = (double*)malloc(ARRAY_SIZE * sizeof(double)); 

    start = clock(); 

    for(int i = 0; i < ARRAY_SIZE; i++) 
    { 
     non_parallel[i] = vec[i] * vec[i]; 
    } 

    end = clock(); 
    printf("Number of seconds: %f\n", (end-start)/(double)CLOCKS_PER_SEC); 


    free(non_parallel); 
    free(vec); 
    return 0; 
} 

Выход:

Number of seconds: 0.446000 
5

Это ненадежный способ фактического количества секунд, так как функция clock() довольно низкая точность, и ваша петля не делает много работы. Вы можете сделать свой цикл более активным, чтобы он работал дольше или использовал лучший метод синхронизации.

Методы более высокой точности являются специфичными для платформы. Для Windows см How to use QueryPerformanceCounter? и Linux см High resolution timer with C++ and Linux?

+3

Um нет, OP уже литье один из операндов «удвоить». – Mysticial

+0

@ Мистическая ошибка с моей стороны, исправлена ​​моя реакция. – jli

+0

Тогда я могу добавить +1 для упоминания высокопроизводительных счетчиков. – Mysticial

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