c - 为了实时数值积分,如何在 c 中测量时间?
问题描述
我试图编写 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()
并没有考虑到内存访问所需的时间(在整个代码中的几个点,我打开一个外部文本文件并将数据保存在其中以用于诊断目的)。
但我不确定是否是这种情况。此外,我找不到任何其他方法来准确测量时间。
有人为什么会这样吗?
编辑:代码在树莓派 3 上编译和执行,用于实现反馈控制器
解决方案
更新:事实证明,clock()
它不适合实时数值计算,因为它只考虑处理器上使用的时间。我通过使用中clock_gettime()
定义的函数解决了这个问题<time.h>
。这将返回具有纳秒分辨率的全球时间(当然,这会带来一定的错误,这取决于您的时钟分辨率,但这是最好的事情)。
答案出奇地难找,感谢Ian Abbott 提供的非常有用的帮助
推荐阅读
- angular - super() 中的 typescript 依赖注入
- flutter - Fluro 包中的 Flutter Navigator 默认路由路由
- datetime - 如何在飞镖中获得一周的开始或结束
- nginx - 使用 nginx 下载文件而不是显示响应的静态位置
- python - 用于遍历文件夹和“获取”文件名并放入列表的 Python 代码
- tabulator - 在初始加载时隐藏嵌套表
- java - Java是否有类似IPC机制的Android Handler?
- javascript - 如何从 Observable 中检索数据并在 Interceptor 中使用它?
- javascript - 如何按首字母对列表进行分组?
- xamarin - Visual Studio for Mac - 在终端中查找组件版本