使用Tic Toc控制循环速度

时间:2014-05-28 18:13:25

标签: performance matlab

我正在编写一个输出到控制设备的DAQ的代码。我想让它每1秒发出一次信号。根据我的处理程序的性能,代码有时需要更长或更短的时间。有没有办法改善这段代码? 经过的时间是1.000877秒。 经过的时间是0.992847秒。 经过的时间是0.996886秒。

for i= 1:100
    tic
    pause(.99)
    toc
end

3 个答案:

答案 0 :(得分:3)

已知使用pause是相当不精确的(大约10毫秒)。最近版本的Matlab已将tic toc优化为低开销且尽可能精确(参见here)。

使用以下代码,您可以使用tic toc比暂停更精确:

ntimes = 100;
times = zeros(ntimes,1);
time_dur = 0.99;

for i= 1:ntimes
    outer = tic;

    while toc(outer) < time_dur

    end

    times(i) = toc(outer);
end
mean(times)
std(times)

以下是50次测量的结果:mean = 0.9900 std = 1.0503e-5,比使用暂停要精确得多。

暂停使用原始代码进行50次测量,我得到:mean = 0.9981 std = 0.0037

答案 1 :(得分:1)

这是shimizu答案的改进版本。主要问题是最小的时钟漂移。每次迭代都会获取时间戳,然后重置计时器。时钟随着这两个命令的执行时间而漂移。

辅助次要改进结合pause和tic-toc技术来降低cpu负载。

ntimes = 100;
times = zeros(ntimes,1);
time_dur = 0.99;
t = tic;
for ix= 1:ntimes
    pause((time_dur*ix-toc(t)-0.1))
    while toc(t) < time_dur*ix
    end
    times(ix) = toc(t);
end
mean(diff(times))
std(diff(times))

答案 2 :(得分:0)

如果您希望DAQ每秒更新一次,请使用带有FIFO缓冲区和时钟的DAQ,并配置为每秒从FIFO中读取一次值。

即使您的MATLAB任务迭代间隔一秒钟运行,与DAQ通信的延迟不一致也会影响您的时间。