为了实时数值积分的目的,如何测量 c 中的时间?
How to measure time in c for the purposes of real-time numerical integration?
我尝试编写 C 代码,其中一些包含时间导数的数值计算需要在实时动态系统设置中执行。为此,我需要在名为 "dt":
的变量中从一个周期到下一个周期进行最准确的时间评估
static clock_t prev_time;
prev_time = clock();
while(1){
clock_t current_time = clock();
//do something
double dt = (double)(current_time - prev_time)/CLOCKS_PER_SEC;
prev_time = current_time;
}
但是,当我通过集成(不断添加)dt
来测试此代码时,即
static double elapsed_time = 0;
//the above-mentioned declaration and initialization in done here
while(1){
//the above-mentioned code is executed here
elapsed_time += dt;
printf("elapsed_time : %lf\n", elapsed_time);
}
我得到的结果明显低于实际情况,一个因素在运行时是恒定的,但当我编辑代码的不相关部分时似乎有所不同(它的范围在实际时间的 1/10 到大约一半之间) .
我目前的猜测是 clock()
没有考虑内存访问所需的时间(在整个代码中的几个点,我打开一个外部文本文件并将数据保存在其中以用于诊断目的)。
但我不确定是不是这样。
另外,我找不到任何其他方法来准确测量时间。
有人知道为什么会这样吗?
编辑:代码在raspberry pi 3上编译和执行,用于实现反馈控制器
Does anyone why this is happening?
clock 测量 CPU 时间,即 CPU 花费在您的进程上的时间 slices/clock 滴答。这在您进行微基准测试时很有用,因为您通常不想测量 CPU 在微基准测试中实际花费在其他进程上的时间,但是当您想要测量事件之间实际经过的时间时它就没用了。
相反,您应该使用 time or gettimeofday 来测量挂钟时间。
更新:事实证明,clock()
不适合实时数值计算,因为它只计算处理器上使用的时间。我使用 <time.h>
中定义的 clock_gettime()
函数解决了这个问题。 returns 具有纳秒分辨率的全球时间(当然,这会带来一定的误差,这取决于您的时钟分辨率,但这是最好的选择)。
答案出奇的难找,所以感谢Ian Abbott提供的非常有用的帮助
我尝试编写 C 代码,其中一些包含时间导数的数值计算需要在实时动态系统设置中执行。为此,我需要在名为 "dt":
的变量中从一个周期到下一个周期进行最准确的时间评估static clock_t prev_time;
prev_time = clock();
while(1){
clock_t current_time = clock();
//do something
double dt = (double)(current_time - prev_time)/CLOCKS_PER_SEC;
prev_time = current_time;
}
但是,当我通过集成(不断添加)dt
来测试此代码时,即
static double elapsed_time = 0;
//the above-mentioned declaration and initialization in done here
while(1){
//the above-mentioned code is executed here
elapsed_time += dt;
printf("elapsed_time : %lf\n", elapsed_time);
}
我得到的结果明显低于实际情况,一个因素在运行时是恒定的,但当我编辑代码的不相关部分时似乎有所不同(它的范围在实际时间的 1/10 到大约一半之间) .
我目前的猜测是 clock()
没有考虑内存访问所需的时间(在整个代码中的几个点,我打开一个外部文本文件并将数据保存在其中以用于诊断目的)。
但我不确定是不是这样。 另外,我找不到任何其他方法来准确测量时间。
有人知道为什么会这样吗?
编辑:代码在raspberry pi 3上编译和执行,用于实现反馈控制器
Does anyone why this is happening?
clock 测量 CPU 时间,即 CPU 花费在您的进程上的时间 slices/clock 滴答。这在您进行微基准测试时很有用,因为您通常不想测量 CPU 在微基准测试中实际花费在其他进程上的时间,但是当您想要测量事件之间实际经过的时间时它就没用了。
相反,您应该使用 time or gettimeofday 来测量挂钟时间。
更新:事实证明,clock()
不适合实时数值计算,因为它只计算处理器上使用的时间。我使用 <time.h>
中定义的 clock_gettime()
函数解决了这个问题。 returns 具有纳秒分辨率的全球时间(当然,这会带来一定的误差,这取决于您的时钟分辨率,但这是最好的选择)。
答案出奇的难找,所以感谢Ian Abbott提供的非常有用的帮助