我正致力于加密实时数据。我开发了加密和解密算法。现在我想用C测量Linux平台上相同的执行时间。我怎样才能正确测量它?我试过它如下
gettimeofday(&tv1, NULL);
/* Algorithm Implementation Code*/
gettimeofday(&tv2, NULL);
Total_Runtime=(tv2.tv_usec - tv1.tv_usec) +
(tv2.tv_sec - tv1.tv_sec)*1000000);
给我时间,以微秒为单位。它是时间测量的正确方法还是我应该使用其他功能?任何暗示都将受到赞赏。
答案 0 :(得分:2)
阅读time(7)。您可能希望将clock_gettime(2)用于CLOCK_PROCESS_CPUTIME_ID
或
CLOCK_MONOTONIC
。或者您可以使用clock(3)(以微秒为单位的CPU时间,因为CLOCK_PER_SEC
总是一百万)。
如果要对整个程序(可执行文件)进行基准测试,请使用time(1)命令。
答案 1 :(得分:1)
clock()
:返回的值是到目前为止使用的CPU时间clock_t;
在程序开始和结束时获取CPU时间。差异就是你想要的。
clock_t begin = clock();
/**** code ****/
clock_t end = clock();
double time_spent = (double)(end - begin) //in microseconds
要获得使用的秒数,我们将差异除以CLOCKS_PER_SEC
。
在C11中timespec_get()
提供纳秒范围内的时间测量。但准确性是实施定义的,可能会有所不同。
答案 2 :(得分:0)
测量正确加密代码的执行时间很简单,虽然有点单调乏味。良好的加密代码的运行时间与输入的质量无关 - 无论你抛出什么,每个输入块总是需要相同数量的操作。如果它没有称为定时攻击的问题。
因此,您唯一需要做的就是展开所有循环,计算操作码并将各个操作码与它们的时钟滴答数相乘以获得准确的运行时间。有一个问题:某些CPU的某些操作具有可变数量的时钟周期,您可能必须将这些更改为具有固定时钟周期数的操作。承认背后的痛苦。
如果您想要的一件事就是知道代码是否运行得足够快以适应您的实时操作系统的插槽,您可以简单地采用最大值并使用NOOP填充下面的情况(您的RTOS可能有一个例行程序)。