Как измерить время выполнения на C в Linux

Я работаю над шифрованием данных в реальном времени. Я разработал алгоритм шифрования и дешифрования. Теперь я хочу измерить время выполнения того же самого на платформе Linux в C. Как я могу правильно его измерить ?. Я пробовал это, как показано ниже

             gettimeofday(&tv1, NULL);
         /* Algorithm Implementation Code*/
             gettimeofday(&tv2, NULL);

        Total_Runtime=(tv2.tv_usec - tv1.tv_usec) +          
                      (tv2.tv_sec - tv1.tv_sec)*1000000);

что дает мне время в микросекундах. Это правильный способ измерения времени или мне следует использовать другую функцию? Любой намек будет оценен по достоинству.


person DeoChandra    schedule 03.01.2017    source источник
comment
Слишком широкий. Профилируйте код если и только если он работает слишком медленно. Это не обязательно должно быть быстрее, чем передача данных.   -  person too honest for this site    schedule 03.01.2017
comment
Здесь много вопросов об измерении времени, их легко найти.   -  person Weather Vane    schedule 03.01.2017
comment
Прошедшее время бесполезно в многозадачных системах, вместо этого вызовите getrusage(2) и посмотрите ru_utime (используемое время ЦП пользователя).   -  person DaBler    schedule 03.01.2017
comment
Может ли этот ответ быть тем, что вам нужно?   -  person Michi    schedule 03.01.2017


Ответы (3)


Прочтите время (7). Вероятно, вы захотите использовать clock_gettime (2) с CLOCK_PROCESS_CPUTIME_ID или CLOCK_MONOTONIC. Или вы можете просто использовать clock (3) (для Процессорное время в микросекундах, поскольку CLOCK_PER_SEC всегда миллион).

Если вы хотите протестировать всю программу (исполняемый файл), используйте время (1 ) команду.

person Basile Starynkevitch    schedule 03.01.2017

clock(): Возвращаемое значение - это процессорное время, используемое до clock_t;

Логика

Получите время процессора в начале и в конце программы. Разница - это то, что вы хотите.

Код

clock_t begin = clock();

/****  code ****/

clock_t end = clock();
double time_spent = (double)(end - begin) //in microseconds

Чтобы получить количество использованных секунд, мы разделили разницу на CLOCKS_PER_SEC.

Более точным

В C11 timespec_get() обеспечивается измерение времени в диапазоне наносекунд. Но точность определяется реализацией и может варьироваться.

person user2736738    schedule 03.01.2017

Измерение времени выполнения правильного кода шифрования просто, хотя и немного утомительно. Время выполнения хорошего кода шифрования не зависит от качества ввода - независимо от того, что вы на него вводите, для него всегда требуется одинаковое количество операций на каждый фрагмент ввода. Если это не так, у вас есть проблема, называемая атакой по времени.

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

Если единственное, что вам нужно, - это знать, работает ли код достаточно быстро, чтобы поместиться в слот вашей ОС реального времени, вы можете просто довести его до максимума и заполнить приведенные ниже случаи с помощью NOOP (в вашей ОСРВ может быть процедура для этого).

person deamentiaemundi    schedule 03.01.2017